我有文件名的形式列表:數控訂購基於圖案列表
['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt']
我不知道如何將這個列表數值排序,以獲得輸出:
['comm_1_1.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt', 'comm_1_10.txt', 'comm_1_11.txt']
我有文件名的形式列表:數控訂購基於圖案列表
['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt']
我不知道如何將這個列表數值排序,以獲得輸出:
['comm_1_1.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt', 'comm_1_10.txt', 'comm_1_11.txt']
你應該分裂所需號碼,並將其轉換爲int
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']
def numeric(i):
return tuple(map(int, i.replace('.txt', '').split('_')[1:]))
sorted(ss, key=numeric)
# ['comm_1_1.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt', 'comm_1_10.txt', 'comm_1_11.txt']
我真的不認爲這是一個最好的答案,但你可以 試試看。用於這種「人排序」的
l = ['comm_1_1.txt', 'comm_1_10.txt', 'comm_1_11.txt', 'comm_1_4.txt', 'comm_1_5.txt', 'comm_1_6.txt']
d = {}
for i in l:
filen = i.split('.')
key = filen[0].split('_')
d[int(key[2])] = i
for key in sorted(d):
print(d[key])
的一種技術是鍵分裂到元組和轉換數字部分實際數字:
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))))
,或者更可讀
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)
該想法是將數字部分和非數字部分分開,並在將數字部分轉換爲實際數字後將這些部分放入列表中(以便10
在之後)。
按字母順序排列列表給出了預期的結果。