Wiem, że brzmi to banalnie, ale nie zdawałem sobie sprawy, że sort()
funkcja Pythona jest dziwna. Mam listę „liczb”, które są w rzeczywistości w postaci ciągów, więc najpierw konwertuję je na liczby całkowite, a następnie próbuję posortować.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
Daje mi:
['1', '10', '2', '200', '22', '23', '3', '4']
Ja chcę
['1','2','3','4','10','22','23','200']
Rozejrzałem się za niektórymi algorytmami związanymi z sortowaniem zestawów liczbowych, ale te, które znalazłem, obejmują sortowanie zestawów alfanumerycznych.
Wiem, że jest to prawdopodobnie nie do pomyślenia problem, ale Google i mój podręcznik nie oferują nic bardziej lub mniej użytecznego niż ta .sort()
funkcja.
list1
. Co sprawiło, że myślisz, żelist
jest aktualizowane?sorted(mylist)
Odpowiedzi:
W rzeczywistości nie przekonwertowałeś swoich stringów na ints. A raczej zrobiłeś, ale potem nic nie zrobiłeś z wynikami. Chcesz:
Jeśli z jakiegoś powodu chcesz zachować ciągi znaków zamiast int (zwykle jest to zły pomysł, ale może musisz zachować zera wiodące lub coś w tym rodzaju), możesz użyć funkcji klucza .
sort
przyjmuje nazwany parametr,key
czyli funkcję wywoływaną na każdym elemencie przed porównaniem. Wartości zwracane przez funkcję klucza są porównywane zamiast bezpośrednio porównywać elementy listy:źródło
list1 = list1.sort(key=int)
użyj just,list1.sort(key=int)
a lista1 będzie już posortowana.Można przekazać do funkcji
key
parametr do tej.sort
metody . Dzięki temu system sortuje według klucza (x) zamiast x.BTW, przekonwertować do listy liczb całkowitych na stałe, należy w
map
funkcjilub rozumienie listy
źródło
Jeśli chcesz użyć
sorted()
funkcji:sorted(list1, key=int)
Zwraca nową posortowaną listę.
źródło
Rodzaj Pythona nie jest dziwny. Po prostu ten kod:
nie robi tego, co myślisz, że jest -
item
nie jest ponownie umieszczany na liście, jest po prostu wyrzucany.Tak czy inaczej, właściwym rozwiązaniem jest używanie tego,
key=int
co inni ci pokazali.źródło
Możesz także użyć:
Jest to bardzo podobne do innych rzeczy, które można znaleźć w Internecie, ale działa również w przypadku znaków alfanumerycznych, takich jak
[abc0.1, abc0.2, ...]
.źródło
Odpowiedź Seamusa Campbella nie działa na python2.x.
list1 = sorted(list1, key=lambda e: int(e))
używanielambda
funkcji działa dobrze.źródło
Wczoraj zbliżyłem się do tego samego problemu i znalazłem moduł o nazwie [natsort] [1], który rozwiązuje twój problem. Posługiwać się:
Działa również w przypadku słowników jako odpowiednik
sorted
. [1]: https://pypi.org/project/natsort/źródło
Spróbuj tego, posortuje listę lokalnie w porządku malejącym (w tym przypadku nie ma potrzeby określania klucza):
Proces
wynik:
źródło
Najnowsze rozwiązanie jest słuszne. Odczytujesz rozwiązania jako ciąg, w którym to przypadku kolejność to 1, potem 100, potem 104, potem 2, potem 21, potem 2001001010, 3 i tak dalej.
Zamiast tego musisz przelać swoje dane wejściowe jako int:
posortowane ciągi:
stringList = (1, 10, 2, 21, 3)
posortowane int:
intList = (1, 2, 3, 10, 21)
Aby rzucić, po prostu umieść stringList wewnątrz int (blahblah).
Jeszcze raz:
źródło
Jeśli chcesz użyć ciągów liczb, lepiej weź inną listę, jak pokazano w moim kodzie, będzie działać dobrze.
źródło
Prosty sposób sortowania listy numerycznej
źródło
prawdziwym problemem jest to, że sortowanie rzeczy jest alfanumeryczne. Więc jeśli masz listę [„1”, „2”, „10”, „19”] i uruchomisz sortowanie, otrzymasz [„1”, „10”. „19”, „2”]. tj. 10 jest przed 2, ponieważ patrzy na pierwszy znak i sortuje zaczynając od niego. Wygląda na to, że większość metod w Pythonie zwraca rzeczy w tej kolejności. Na przykład, jeśli masz katalog o nazwie abc z plikami oznaczonymi jako 1.jpg, 2.jpg itp., Powiedz do 15.jpg i zrobisz plik_list = os.listdir (abc), lista_plików nie jest uporządkowana zgodnie z oczekiwaniami, ale raczej file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Jeśli kolejność przetwarzania plików jest ważna (prawdopodobnie dlatego nadałeś im nazwy numeryczne), kolejność nie jest taka, jak myślisz, że będzie. Możesz tego uniknąć, używając dopełnienia zerami. Na przykład, jeśli masz listę alist = ['01', '03', '05', '10', '02', '04', '06] i uruchomisz na niej sortowanie, otrzymasz żądaną kolejność. alist = ['01', '02' itd.], ponieważ pierwszy znak to 0, który występuje przed 1. Ilość potrzebnych wypełnień zerami jest określana na podstawie największej wartości na liście. Na przykład, jeśli największa to powiedzmy od 100 do 1000 musisz wpisać pojedyncze cyfry jako 001, 002 --- 010,011-100, 101 itd.
źródło
To zadziałało dla mnie przy użyciu Pythona w wersji 3, chociaż nie w wersji 2.
źródło