Mam niektóre dane na liście list lub liście krotek, takie jak to:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
I chcę posortować według 2. elementu w podzbiorze. Oznacza to, że sortowanie według 2,5,8 skąd 2
pochodzi (1,2,3)
, 5
pochodzi z (4,5,6)
. Jak to najczęściej robić? Czy powinienem przechowywać krotki lub listy na mojej liście?
Odpowiedzi:
lub:
źródło
key=itemgetter(1)
i na początku pliku:from operator import itemgetter
sort
tutaj jest metodaList
obiektu Pythona, który odbiera funkcję lambda jakokey
parametr. Możesz nazwać to jakotup
, lubt
cokolwiek zechcesz i nadal będzie działać.tup
tutaj określa indeks krotki listy, więc1
oznacza, że sortowanie będzie wykonywane według drugich wartości krotek z oryginalnej listy (2, 5, 8
).lambda
podejście do być prostsze niż nieintuicyjneitemgetter
klasie,itemgetter
ma rzeczywiście wydają się być szybsze . Jestem ciekawy, dlaczego tak jest. Podejrzewam, żelambda
ponosisz ukryty koszt przechwytywania wszystkich zmiennych lokalnych w kontekście zamknięcia, podczas gdyitemgetter
instancja tego nie robi. tl; dr: Zawsze używajitemgetter
, bo prędkość wygrywa.źródło
itemgetter
klasę uporządkować 126% szybciej niż przeciętnie równoważnejlambda
funkcji.data.sort(key=itemgetter(3,1))
Chcę tylko dodać odpowiedź Stephena, jeśli chcesz posortować tablicę od wysokiej do niskiej, innym sposobem niż w powyższych komentarzach jest dodanie tego do wiersza:
a wynik będzie następujący:
źródło
Aby posortować według wielu kryteriów, mianowicie na przykład według drugiego i trzeciego elementu w krotce, pozwól
i tak zdefiniuj na przykład lambda, która zwraca krotkę opisującą priorytet
źródło
Odpowiedź Stephena jest tą, której użyłbym. Dla kompletności, oto wzór DSU (decorate-sort-undecorate) z listami:
Lub bardziej zwięźle:
Jak zauważono w Pythonie sortowania w Pythonie , nie jest to konieczne od Python 2.4, kiedy dostępne są kluczowe funkcje.
źródło
Aby posortować listę krotek
(<word>, <count>)
,count
w porządku malejącym iword
alfabetycznym:Używam tej metody:
i daje mi wynik:
źródło
Bez lambda:
źródło
itemgetter()
jest nieco szybszy niżlambda tup: tup[1]
, ale wzrost jest stosunkowo niewielki (około 10 do 25 procent).(Sesja IPython)
źródło
Odpowiedź Stephena jest do rzeczy! Oto przykład lepszej wizualizacji,
Wołajcie o fanów Ready Player One! =)
key
to funkcja, która zostanie wywołana w celu przekształcenia elementów kolekcji w celu porównania .. jakcompareTo
metoda w Javie.Parametr przekazany do klucza musi być czymś, co można wywołać. Tutaj użycie
lambda
tworzy anonimową funkcję (którą można wywołać).Składnia lambda to słowo lambda, po którym następuje iterowalna nazwa, a następnie pojedynczy blok kodu.
Poniżej przykład sortujemy listę krotek, która zawiera informacje o czasie określonego wydarzenia i nazwę aktora.
Sortujemy tę listę według czasu wystąpienia zdarzenia - który jest 0 elementem krotki.
Uwaga -
s.sort([cmp[, key[, reverse]]])
sortuje pozycje s na miejscuźródło
Sortowanie krotki jest dość proste:
źródło