Eine Technik für diese Art von „human Sortierung“ verwendet wird, ist Schlüssel zu Tupeln spalten und numerischen Teile tatsächlichen Zahlen konvertieren:
ss = ['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt']
print(sorted(ss, key=lambda x : map((lambda v: int(v) if "0" <= v[0] <= "9" else v), re.findall("[0-9]+|[^0-9]+", x))))
oder, besser lesbar
def sortval(x):
if "0" <= x <= "9":
return int(x)
else:
return x
def human_sort_key(x):
return map(sortval, re.findall("[0-9]+|[^0-9]+", x))
print sorted(ss, key=human_sort_key)
Die Idee besteht darin, zwischen numerischen und nicht-numerischen Teilen zu teilen und die Teile in eine Liste zu setzen, nachdem die numerischen Teile in tatsächliche Zahlen umgewandelt wurden (so dass 10
nachkommt).
Lexikografische Sortierung der Listen ergibt das erwartete Ergebnis.