2012-11-16 22 views
9
order = ['w','x','a','z'] 
[(object,'a'),(object,'x'),(object,'z'),(object,'a'),(object,'w')] 

Jak sortować powyższą listę krotek według drugiego elementu według listy kluczy dostarczonej przez "zamówienie"?sortowanie listy krotek według dowolnego klucza

UPDATE na 11/18/13:

znalazłem dużo lepsze podejście do tej kwestii zmienności gdzie klawisze są pewne, że będzie wyjątkowy, szczegółowe w tej kwestii: Python: using a dict to speed sorting of a list of tuples.

Moje powyższe pytanie nie ma zastosowania, ponieważ lista krotek zawiera dwie krotki z kluczową wartością 'a'.

+0

Czy możesz podać przykład oczekiwanego rezultatu? – enginefree

Odpowiedz

11

Można użyć sorted i jako key podać funkcję, która zwraca indeks drugiej wartości każdej krotki na liście order.

>>> sorted(mylist,key=lambda x: order.index(x[1])) 

[('object', 'w'), ('object', 'x'), ('object', 'a'), ('object', 'a'), ('object', 'z')] 

Uważaj, to się nie powiedzie, gdy wartość z krotek nie jest obecny na liście order.

Edit:

Aby być trochę bardziej bezpieczny, można użyć:

sorted(mylist,key=lambda x: x[1] in order and order.index(x[1]) or len(order)+1) 

To będzie umieścić wszystkie wpisy z kluczem, który brakuje order listy na końcu wynikowa lista.

+0

Ta ostatnia edycja była bardzo pomocna, ponieważ teraz mogę pozwolić, aby sortowanie zawiodło w bardzo elegancki sposób. Dzięki! – Cole

Powiązane problemy