Python Analog der Natsort -Funktion von PHP (sortieren Sie eine Liste mit einem Algorithmus "natürlicher Ordnung") [Duplikat
Frage
Diese Frage hat hier bereits eine Antwort:
Ich würde gerne wissen, ob es etwas Ähnliches gibt wie PHP Natsort Funktion in Python?
l = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
l.sort()
gibt:
['image1.jpg', 'image12.jpg', 'image15.jpg', 'image3.jpg']
Aber ich möchte:
['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']
AKTUALISIEREN
Lösungsbasis auf dieser Link
def try_int(s):
"Convert to integer if possible."
try: return int(s)
except: return s
def natsort_key(s):
"Used internally to get a tuple by which s is sorted."
import re
return map(try_int, re.findall(r'(\d+|\D+)', s))
def natcmp(a, b):
"Natural string comparison, case sensitive."
return cmp(natsort_key(a), natsort_key(b))
def natcasecmp(a, b):
"Natural string comparison, ignores case."
return natcmp(a.lower(), b.lower())
l.sort(natcasecmp);
Lösung
Aus meine Antwort zu Natürlicher Sortieralgorithmus:
import re
def natural_key(string_):
"""See http://www.codinghorror.com/blog/archives/001018.html"""
return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]
Beispiel:
>>> L = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
>>> sorted(L)
['image1.jpg', 'image12.jpg', 'image15.jpg', 'image3.jpg']
>>> sorted(L, key=natural_key)
['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']
Unicode -Strings zu unterstützen, .isdecimal()
sollte anstelle von verwendet werden .isdigit()
. Siehe Beispiel in @Phihags Kommentar. Verwandt: Wie man Unicodes Numeric Value -Eigenschaft enthüllt.
.isdigit()
kann auch fehlschlagen (Rückgabewert, der nicht akzeptiert wird durch int()
) für eine Bytestring auf Python 2 in einigen Orten zB, ' xb2' ('²') in CP1252 -Gebietsschema unter Windows.
Andere Tipps
Sie können sich den Dritten ansehen Natsort Bibliothek auf PYPI:
>>> import natsort
>>> l = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
>>> natsort.natsorted(l)
['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']
Vollständige Offenlegung, ich bin der Autor.
Diese Funktion kann als die verwendet werden key=
Argument für sorted
in Python 2.x und 3.x:
def sortkey_natural(s):
return tuple(int(part) if re.match(r'[0-9]+$', part) else part
for part in re.split(r'([0-9]+)', s))