PDA

Visualizza la versione completa : [PYTHON] Lista ordinata chiave:valore


Metallica
18-11-2002, 23:46
Allora ho una struttura di questo tipo

>>> diz = {'mar':'5', 'val':'15', 'aug':'3'}
io vorrei avere come output

{'val':'15', 'mar':'5', 'aug':'3'}
quindi ordinare il tutto secondo il valore in modo discendente.

Il dizionario sembrava la soluzione pi adatta, ma a quanto purtroppo ho capito questi non si possono ordinare mantenendo la corrispondenza (nn posso quindi ottenere un qualcosa come postato nel 2 QUOTE).

A quanto ho capito posso ordinare o solo le chiavi o solo i valori;
ordina secondo le chiavi:

>>> diz = {'mar':'5', 'val':'15', 'aug':'3'}
>>> k = diz.keys()
>>> k.sort()
>>> k
['aug','mar','val']

ordina secondo i valori:

>>> diz = {'mar':'5', 'val':'15', 'aug':'3'}
>>> k = diz.values()
>>> k.sort()
>>> k
['3,'5,'15']

Ma come fare ad avere questo:

{'val':'15', 'mar':'5', 'aug':'3'}???

Cosa devo usare al posto dei dizionari???
Grazie dell'aiuto e ciao a tutti :)

Metallica
19-11-2002, 14:49
nessuno si occupa di python qui?
UP :(

chris
19-11-2002, 19:12
in teoria questo codice fa quello che vuoi, ma in pratica, mi sa che i dizionari vengono ordinati secondo interni...
io userei una lista di tuple.

def OrdinaDiz2(diz, debug = 0):
if(debug):
print diz
diz2 = {}
b = diz.items()
if(debug):
print b
b.sort(lambda a,b:int(b[1])-int(a[1]))
if(debug):
print b
for i in b:
diz2[i[0]] = i[1]
if(debug):
print i, i[0], i[1]
print diz2
return diz2

OrdinaDiz2({'val':'15', 'mar':'5', 'aug':'3', 'cavolo':'852', 'scemo':'0'}, 1)

########## Output ##############
{'cavolo': '852', 'mar': '5', 'aug': '3', 'val': '15', 'scemo': '0'}
[('cavolo', '852'), ('mar', '5'), ('aug', '3'), ('val', '15'), ('scemo', '0')]
[('cavolo', '852'), ('val', '15'), ('mar', '5'), ('aug', '3'), ('scemo', '0')]
('cavolo', '852') cavolo 852
('val', '15') val 15
('mar', '5') mar 5
('aug', '3') aug 3
('scemo', '0') scemo 0
{'cavolo': '852', 'mar': '5', 'aug': '3', 'val': '15', 'scemo': '0'}
{'cavolo': '852', 'mar': '5', 'aug': '3', 'val': '15', 'scemo': '0'}

hexen
19-11-2002, 19:59
Originariamente inviato da Metallica

Ma come fare ad avere questo:

{'val':'15', 'mar':'5', 'aug':'3'}


mmm...
AFAIK i dizionari si possono ordinare per chiavi e non per valori

cmq se non ti cambia nulla fare:


{15:'val,5:'mar',3:'aug'}
(occhio: i 15 5 e 3 nn sono stringhe ma interi)

puoi fare:


#dizionario di partenza non ordinato:
diz_partenza = {5:'mar',3:'aug',15:'val'}

#prendo le chiavi:
k = diz_partenza.keys()

#le metto in ordine decrescente:
k.reverse()

#creo un diz vuoto:
diz_ordinato = {}

#metto nel nuovo dizionario le chiavi in ordine e i
#rispettivi valori, uguali a quelli del dizionario di partenza:
for i in k: diz_ordinato[i] = diz_partenza[i]

a meno che non vi sia una a me sconosciuta funzione per invertire le chiavi con i valori

ciao

Metallica
19-11-2002, 20:23
grazie ragazzi ora valuto proprio la situazione e vi far sapere ;)

cmq python una figata sto usando un programma con tanto di sintassi colorata e indentazione automatica e il codice che ne dieriva na figata

hexen
19-11-2002, 20:34
Originariamente inviato da Metallica
sto usando un programma con tanto di sintassi colorata e indentazione automatica e il codice che ne dieriva na figata

questo lo fa anche l'editor che sta insieme all'interprete interattivo

cmq volevo postare la funzione per invertire chiavi/valori...



def diz_inverti(d):
k = d.keys()
v = d.values()
d2 = {}
for i in range(len(d)):
d2[v[i]] = k[i]
return d2

...che si aggancia al codice che ho postato prima

buon divertimento con il serpentello

Loading