2014-01-26 10 views
8

Ich habe eine Liste:Specific Art eine Liste von Zahlen, die durch Punkte getrennt

L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.'] 

Ich will es in der nächsten Reihenfolge sortieren:

1.1.1. 
1.1.2. 
1.1.3. 
1.1.4. 
1.1.10. 
1.1.11. 
1.1.12. 
1.1.13. 

Die folgende Methode kein Ergebnis produzieren:

+0

Ihre Frage hat wirklich nichts mit Django zu tun. –

+1

Was passiert, wenn in der Liste ein Wert von "1.2.1" steht? Was passiert, wenn es "2.1.1" gibt? Sollte die Sorte alle in Betracht ziehen? –

Antwort

9

Holen Sie sich den letzten Teil, konvertieren Sie das zu einem int und geben Sie es als Schlüssel für den Vergleich

print(sorted(L, key=lambda x: int(x.split(".")[2]))) 

Wenn Sie alle Teile in Betracht gezogen werden, können Sie wie diese tun können

print(sorted(L, key=lambda x: [int(i) for i in x.rstrip(".").split(".")])) 

Es . am Ende der Saiten entfernt, teilt sie basierend auf . und wandelt dann jede und jeder Teil davon zu einem int. Die zurückgegebene Liste wird zum Vergleich verwendet.

Sie können mehr darüber lesen, wie verschiedene Sequenzen werden von Python verglichen werden, here

Ausgabe

['1.1.1.','1.1.2.','1.1.3.','1.1.4.','1.1.10.','1.1.11.','1.1.12.','1.1.13.'] 
5

Wenn Sie mit dem alle Ziffern sortieren müssen, erzeugen eine Folge von ganzen Zahlen in die Schlüsselfunktion:

sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()]) 

Diese Methode ist robust in t er Gesicht der nicht-digit Werte zwischen den Punkten.

Demo:

>>> L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.'] 
>>> sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()]) 
['1.1.1.', '1.1.2.', '1.1.3.', '1.1.4.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.'] 

Ihr spezifischer Versuch gibt nur die zweite Nummer in der Liste, die für Ihre Beispieldaten sind immer1.

Verwandte Themen