Ich weiß, dass dies trivial klingt, aber ich wusste nicht, dass die sort()
Funktion von Python seltsam war. Ich habe eine Liste von "Zahlen", die tatsächlich in Zeichenfolgenform vorliegen, also konvertiere ich sie zuerst in Ints und versuche dann eine Sortierung.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
Gibt mir:
['1', '10', '2', '200', '22', '23', '3', '4']
Was ich will ist
['1','2','3','4','10','22','23','200']
Ich habe mich nach einigen Algorithmen umgesehen, die mit dem Sortieren von numerischen Sätzen verbunden sind, aber alle, die ich gefunden habe, beinhalten das Sortieren von alphanumerischen Sätzen.
Ich weiß, dass dies wahrscheinlich ein Kinderspiel ist, aber Google und mein Lehrbuch bieten nichts mehr oder weniger Nützliches als die .sort()
Funktion.
list1
. Warum hast du gedacht,list
dass es aktualisiert wird?sorted(mylist)
Antworten:
Sie haben Ihre Zeichenfolgen nicht in Ints konvertiert. Oder besser gesagt, Sie haben es getan, aber dann haben Sie nichts mit den Ergebnissen gemacht. Was Sie wollen ist:
Wenn Sie aus irgendeinem Grund Zeichenfolgen anstelle von Ints beibehalten müssen (normalerweise eine schlechte Idee, aber möglicherweise müssen Sie führende Nullen oder ähnliches beibehalten), können Sie eine Schlüsselfunktion verwenden.
sort
Nimmt einen benannten Parameter,key
eine Funktion, die für jedes Element aufgerufen wird, bevor es verglichen wird. Die Rückgabewerte der Tastenfunktion werden verglichen, anstatt die Listenelemente direkt zu vergleichen:quelle
list1 = list1.sort(key=int)
Verwenden Sie stattdessen stattdessen justlist1.sort(key=int)
und list1 wird bereits sortiert.Sie können eine Funktion an den
key
Parameter an die.sort
Methode übergeben . Damit sortiert das System nach Schlüssel (x) anstelle von x.Übrigens, um die Liste dauerhaft in Ganzzahlen umzuwandeln, verwenden Sie die
map
Funktionoder Listenverständnis
quelle
Wenn Sie die
sorted()
Funktion verwenden möchten :sorted(list1, key=int)
Es wird eine neue sortierte Liste zurückgegeben.
quelle
Pythons Sorte ist nicht sonderbar. Es ist nur so, dass dieser Code:
tut nicht das, was du denkst -
item
wird nicht wieder in die Liste aufgenommen, sondern einfach weggeworfen.Wie auch immer, die richtige Lösung ist,
key=int
wie andere Ihnen gezeigt haben.quelle
Sie können auch verwenden:
Dies ist sehr ähnlich zu anderen Sachen, die Sie im Internet finden können, funktioniert aber auch für alphanumerische wie
[abc0.1, abc0.2, ...]
.quelle
Die Antwort von Seamus Campbell funktioniert unter python2.x nicht.
list1 = sorted(list1, key=lambda e: int(e))
Die Verwendung derlambda
Funktion funktioniert gut.quelle
Ich habe mich gestern dem gleichen Problem genähert und ein Modul namens [natsort] [1] gefunden, das Ihr Problem löst. Verwenden:
Es funktioniert auch für Wörterbücher als Äquivalent von
sorted
. [1]: https://pypi.org/project/natsort/quelle
Versuchen Sie Folgendes: Die Liste wird in absteigender Reihenfolge sortiert (in diesem Fall muss kein Schlüssel angegeben werden):
Prozess
Ausgabe:
quelle
Die neueste Lösung ist richtig. Sie lesen Lösungen als Zeichenfolge. In diesem Fall lautet die Reihenfolge 1, dann 100, dann 104, gefolgt von 2, dann 21, dann 2001001010, 3 usw.
Sie müssen stattdessen Ihre Eingabe als int CAST:
sortierte Zeichenfolgen:
stringList = (1, 10, 2, 21, 3)
sortierte Ints:
intList = (1, 2, 3, 10, 21)
Zum Casting setzen Sie einfach die stringList in int (blahblah).
Nochmal:
quelle
Wenn Sie Zeichenfolgen der Zahlen verwenden möchten, nehmen Sie besser eine andere Liste, wie in meinem Code gezeigt, es wird gut funktionieren.
quelle
Einfache Möglichkeit, eine numerische Liste zu sortieren
quelle
Das eigentliche Problem ist, dass die Sortierung die Dinge alphanumerisch sortiert. Wenn Sie also eine Liste ['1', '2', '10', '19'] haben und sort ausführen, erhalten Sie ['1', '10'. '19', '2']. dh 10 kommt vor 2, weil es das erste Zeichen betrachtet und danach sortiert. Es scheint, dass die meisten Methoden in Python die Dinge in dieser Reihenfolge zurückgeben. Wenn Sie beispielsweise ein Verzeichnis mit dem Namen abc haben, dessen Dateien mit 1.jpg, 2.jpg usw. gekennzeichnet sind, sagen Sie bis zu 15.jpg, und Sie file_list = os.listdir (abc) ausführen, wird die file_list nicht wie erwartet sortiert, sondern als file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Wenn die Reihenfolge, in der Dateien verarbeitet werden, wichtig ist (vermutlich haben Sie sie deshalb numerisch benannt), entspricht die Reihenfolge nicht Ihrer Meinung nach. Sie können dies vermeiden, indem Sie "Nullen" auffüllen. Wenn Sie beispielsweise eine Liste alist = ['01', '03', '05', '10', '02', '04', '06] haben und darauf sortieren, erhalten Sie die gewünschte Reihenfolge. alist = ['01', '02' usw.], da das erste Zeichen 0 ist, das vor 1 steht. Die Anzahl der benötigten Nullen wird durch den größten Wert in der Liste bestimmt. Zum Beispiel, wenn das größte zwischen 100 und 100 liegt 1000 müssen Sie einzelne Ziffern als 001, 002 --- 010,011--100, 101 usw. auffüllen.
quelle
Dies funktionierte bei mir mit Python Version 3, in Version 2 jedoch nicht.
quelle