以数字为单位对数据进行数字排序

时间:2016-09-29 06:02:57

标签: python sorting

我有一个表格中的文件名列表:

['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']

3 个答案:

答案 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])