我有一个表格中的文件名列表:
['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']
答案 0 :(得分:3)
您应该拆分所需的数字并将其转换为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']
答案 1 :(得分:2)
用于此类“人类排序”的一种技术是将键拆分为元组并将数字部分转换为实际数字:
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
位于2
之后)。
按字典顺序对列表进行排序可得到预期的结果。
答案 2 :(得分:1)
我真的不认为这是一个最好的答案,但你可以尝试一下。
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])