2013-10-14 9 views
8

Ich habe eine Liste, die von Details wie folgt zusammen:Sortierung in Python - Wie sortiere ich eine Liste mit alphanumerischen Werten?

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 

jetzt, ich will diese Liste sortieren, so dass die Werte in der folgenden Reihenfolge sind:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"] 

Gerade list1.sort() offensichtlich tun nicht die richtige Antwort geben - es gibt:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"] 

ich gehe davon aus das ist, weil python behandelt alle diese als Zeichenfolgen direkt. Allerdings möchte ich sie basierend auf ihrem numerischen Wert FIRST und dann das Zeichen, das auf die Zahl folgt sortieren.

Wie gehe ich vor?

Vielen Dank :)

+0

Sehen Sie diesen Beitrag (http://stackoverflow.com/questions/11850425/custom-python-list-sorting) und definieren Sie eine benutzerdefinierte Vergleichsfunktion. – lurker

+2

Dies wird ** natürliche Sortierung ** genannt. mögliches Duplikat von [Hat Python eine eingebaute Funktion für String Natural Sort?] (http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-) Sortierung) –

Antwort

11

Sie wollen natural sort verwenden:

import re 

_nsre = re.compile('([0-9]+)') 
def natural_sort_key(s): 
    return [int(text) if text.isdigit() else text.lower() 
      for text in re.split(_nsre, s)] 

Beispiel Nutzung:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 
>>> list1.sort(key=natural_sort_key) 
>>> list1 
['1', '2C', '36', '100A', '132', '302F', '342B'] 

Diese Funktionen durch Aufteilen der Elemente in Listen, die Zahlen zu trennen und sie als ganze Zahlen anstelle von Strings zu vergleichen:

>>> natural_sort_key("100A") 
['', 100, 'a'] 
>>> natural_sort_key("342B") 
['', 342, 'b'] 

Beachten Sie, dass dies nur funktioniert, in Python3, wenn man immer Ints mit ints und Strings mit Strings vergleichen, sonst erhalten Sie eine TypeError: unorderable types Ausnahme.

+1

Beachten Sie, dass für Python 3 Alle Elemente müssen eine ähnliche Struktur haben. '['a1', '2b']' würde mit einem 'TypeError' fehlschlagen. –

+0

@StevenRumbalski: ah ich habe das vergessen, danke. Ich werde es erwähnen. – Claudiu

0

Nun, müssen Sie einen Weg finden, zuerst Ihre Strings in Zahlen zu konvertieren. Zum Beispiel

import re 
def convert(str): 
    return int("".join(re.findall("\d*", str))) 

und dann verwenden Sie es als eine Art Schlüssel:

list1.sort(key=convert) 
+0

Es gibt einige natürliche Sortierlösungen hier: http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – nofinator

Verwandte Themen