2012-07-22 8 views
8

Sto stampando alcune liste ma i valori non sono ordinati.ordinamento di più elenchi basati su un singolo elenco in python

for f, h, u, ue, b, be, p, pe, m, me in zip(filename, human_rating, rating_unigram, percentage_error_unigram, rating_bigram, percentage_error_bigram, rating_pos, percentage_error_pos, machine_rating, percentage_error_machine_rating): 
     print "{:>6s}{:>5.1f}{:>7.2f}{:>8.2f} {:>7.2f} {:>7.2f} {:>7.2f} {:>8.2f} {:>7.2f} {:>8.2f}".format(f,h,u,ue,b,be,p,pe,m,me) 

Qual è il modo migliore per risolvere tutte queste liste in base ai valori di 'nome del file'?

Quindi, se:

filename = ['f3','f1','f2'] 
human_rating = ['1','2','3'] 
etc. 

Poi l'ordinamento sarebbe tornato:

filename = ['f1','f2','f3'] 
human_rating = ['2','3','1'] 
etc. 

risposta

8

avrei zip quindi ordinare:

zipped = zip(filename, human_rating, …) 
zipped.sort() 
for row in zipped: 
    print "{:>6s}{:>5.1f}…".format(*row) 

Se si vuole veramente ottenere le singole liste indietro, Vorrei ordinarli come sopra, quindi decomprimerli:

filename, human_rating, … = zip(*zipped) 
+0

Python 3 nota: zip restituisce un iteratore in Python 3, la lista utilizzare per vedere il suo contenuto, ' zipped = list (zip (nomefile, human_rating, ...)) ' –

0

zip restituisce un elenco di tuple che è possibile ordinare in base al loro primo valore. Quindi:

for ... in sorted(zip(...)): 
    print " ... " 
2

ne dite di questo: zip in una lista di tuple, ordinare l'elenco di tuple, poi "decomprimere"?

l = zip(filename, human_rating, ...) 
l.sort() 
# 'unzip' 
filename, human_rating ... = zip(*l) 

O in una sola riga:

filename, human_rating, ... = zip(*sorted(zip(filename, human_rating, ...))) 

esempio di esecuzione:

foo = ["c", "b", "a"] 
bar = [1, 2, 3] 
foo, bar = zip(*sorted(zip(foo, bar))) 
print foo, "|", bar # prints ('a', 'b', 'c') | (3, 2, 1) 
Problemi correlati