list.sort()
sortuje listę i zastępuje oryginalną listę, a sorted(list)
zwraca posortowaną kopię listy bez zmiany oryginalnej listy.
- Kiedy jedno jest preferowane?
- Który jest bardziej wydajny? O ile?
- Czy po wykonaniu można przywrócić listę do stanu nieposortowanego
list.sort()
?
sorted()
argument ciągu, ale uważasz, że to lista, otrzymasz wynik listy, a nie ciąg : niesorted("abcd", reverse=True)
daje['d', 'c', 'b', 'a']
"dcba"
Odpowiedzi:
sorted()
zwraca nową posortowaną listę, pozostawiając nienaruszoną oryginalną listę.list.sort()
sortuje listę w miejscu , mutując indeksy listy i zwracaNone
(jak wszystkie operacje w miejscu).sorted()
działa na dowolnych iterowalnych, nie tylko listach. Ciągi, krotki, słowniki (dostaniesz klucze), generatory itp., Zwracając listę zawierającą wszystkie posortowane elementy.Użyj,
list.sort()
jeśli chcesz zmutować listę,sorted()
gdy chcesz ponownie posortować nowy obiekt. Zastosowaniesorted()
gdy chcemy uporządkować coś, co jest iterable, a nie lista jeszcze .W przypadku list
list.sort()
jest szybszy niżsorted()
dlatego, że nie musi tworzyć kopii. W przypadku innych iteracji nie masz wyboru.Nie, nie możesz odzyskać oryginalnych pozycji. Po zadzwonieniu
list.sort()
oryginalne zamówienie zniknęło.źródło
None
, jest to znak, że operacje są wykonywane w miejscu, dlatego kiedy chcesz wydrukowaćlist.sort()
, zwraca None.list.sort
mutuje listę w miejscu i zwracaNone
sorted
przyjmuje dowolną iterowalną i zwraca posortowaną nową listę.sorted
jest równoważne z tą implementacją Pythona, ale wbudowana funkcja CPython powinna działać wymiernie szybciej, ponieważ jest napisana w C:list.sort
gdy nie chcesz zachować oryginalnej kolejności sortowania (dzięki temu będziesz mógł ponownie użyć listy w miejscu) i gdy jesteś jedynym właścicielem listy (jeśli lista jest współdzielona przez inny kod, a ty mutuj go, możesz wprowadzić błędy, w których używana jest ta lista).sorted
gdy chcesz zachować oryginalną kolejność sortowania lub gdy chcesz utworzyć nową listę, do której należy tylko kod lokalny.Nie - chyba że sam wykonałeś kopię, informacje te zostaną utracone, ponieważ sortowanie odbywa się na miejscu.
Aby zilustrować karę tworzenia nowej listy, użyj modułu timeit, oto nasza konfiguracja:
A oto nasze wyniki dla listy losowo ułożonych 10000 liczb całkowitych, jak widzimy tutaj, obaliliśmy starszy mit dotyczący kosztów tworzenia listy :
Python 2.7
Python 3
Po kilku opiniach zdecydowałem, że pożądany będzie kolejny test o różnych cechach. Tutaj podaję tę samą losowo uporządkowaną listę o długości 100 000 dla każdej iteracji 1000 razy.
Interpretuję różnicę tego większego rodzaju pochodzącą z kopiowania wspomnianego przez Martijna, ale nie dominuje ona do punktu podanego w starszej, bardziej popularnej odpowiedzi tutaj, tutaj wzrost czasu wynosi tylko około 10%
Uruchomiłem również powyższe na znacznie mniejszym formacie i zobaczyłem, że nowa
sorted
wersja kopii nadal zajmuje około 2% dłuższy czas działania na długości 1000.Poke również uruchomił swój własny kod, oto kod:
Znalazł dla sortowania według długości 1000000, (uruchomił 100 razy) podobny wynik, ale tylko o około 5% wzrost w czasie, oto wynik:
Wniosek:
Duża lista sortowana przy
sorted
tworzeniu kopii prawdopodobnie zdominuje różnice, ale samo sortowanie zdominuje operację, a uporządkowanie kodu wokół tych różnic byłoby przedwczesną optymalizacją. Użyłbym,sorted
gdy potrzebuję nowej posortowanej listy danych, i użyłbym,list.sort
gdy potrzebowałem posortować listę w miejscu, i pozwolić mi określić moje wykorzystanie.źródło
sorted()
należy przydzielić nowy obiekt listy i skopiować odniesienia; reszta ścieżek kodu jest identyczna. Sprawdź, czy możesz uruchomić te same testy z większymi listami. Porównaj to z tworzeniem kopii list i sprawdź, czy możesz odtworzyć znalezione różnice itp.Główną różnicą jest to, że
sorted(some_list)
zwraca nowylist
:i
some_list.sort()
, sortuje listę w lokalu :Pamiętaj, że ponieważ
a.sort()
nic nie zwraca,print a.sort()
zostanie wydrukowaneNone
.Czy po list.sort () można pobrać oryginalne pozycje listy?
Nie, ponieważ modyfikuje oryginalną listę.
źródło
print a.sort()
nic nie wydrukuje.None
, wyjaśnię to.Funkcja .sort () przechowuje wartość nowej listy bezpośrednio w zmiennej listy; więc odpowiedź na twoje trzecie pytanie brzmiałaby NIE. Również jeśli zrobisz to za pomocą sortowania (listy), możesz go użyć, ponieważ nie jest przechowywany w zmiennej listy. Czasami również metoda .sort () działa jako funkcja lub mówi, że pobiera w niej argumenty.
Musisz przechowywać wartość posortowanej (listy) w zmiennej jawnie.
Również w przypadku krótkiego przetwarzania danych prędkość nie będzie różnicy; ale dla długich list; powinieneś bezpośrednio użyć metody .sort () do szybkiej pracy; ale znów staniecie wobec nieodwracalnych działań.
źródło
list.sort()
Metoda sortuje przedmiot listy na miejscu..sort()
metoda pobiera argument i działa jako funkcja. Nazywamy to również metodą, ponieważ jest to atrybut typu danych listy.Oto kilka prostych przykładów, które pokazują różnicę w działaniu:
Zobacz listę liczb tutaj:
Dzwoniąc
sorted
na tę listę,sorted
zrobi kopię listy. (Oznacza to, że Twoja oryginalna lista pozostanie niezmieniona).Zobaczmy.
zwroty
Patrząc
nums
ponownieWidzimy oryginalną listę (niezmienioną i NIE posortowaną).
sorted
nie zmienił oryginalnej listyBiorąc tę samą
nums
listę i stosując na niejsort
funkcję, zmieni aktualną listę.Zobaczmy.
Począwszy od naszej
nums
listy, aby upewnić się, treść jest nadal taka sama.Teraz oryginalna lista liczb jest zmieniona i patrząc na liczby widzimy, że nasza oryginalna lista uległa zmianie i jest teraz posortowana.
źródło
sort () nie zwraca żadnej wartości.
Metoda sort () po prostu sortuje elementy danej listy w określonej kolejności - Rosnąco lub Malejąco bez zwracania żadnej wartości.
Składnia metody sort () to:
źródło