我有一个文件名列表:
a = ['data_1-0.hamster.raw',
'data_0-0.hamster.raw',
'data_9-1.hamster.raw',
'data_2-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-10.hamster.raw',
'data_0-2.hamster.raw']
我想对这个列表进行排序,这样我就有了这个输出:
a = ['data_0-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-2.hamster.raw',
'data_0-10.hamster.raw',
'data_1-0.hamster.raw',
'data_2-0.hamster.raw',
'data_9-1.hamster.raw']
这是我制作的代码:
sorted(a, key=lambda f: int(re.search(r'-(d+)[^-]*$', f).group(1)))
但我对重新语法有点困惑,这就是我得到的:
a = ['data_1-0.hamster.raw',
'data_0-0.hamster.raw',
'data_2-0.hamster.raw',
'data_9-1.hamster.raw',
'data_0-1.hamster.raw',
'data_0-2.hamster.raw',
'data_0-10.hamster.raw']
它似乎对连字符后的数字起作用,但对第一个数字不起作用。
您可以执行以下操作:
import re
pattern = re.compile('data_(d+)-(d+)')
a = ['data_1-0.hamster.raw',
'data_0-0.hamster.raw',
'data_9-1.hamster.raw',
'data_2-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-10.hamster.raw',
'data_0-2.hamster.raw']
result = sorted(a, key=lambda s: tuple(map(int, pattern.search(s).groups())))
print(result)
输出
['data_0-0.hamster.raw', 'data_0-1.hamster.raw', 'data_0-2.hamster.raw', 'data_0-10.hamster.raw', 'data_1-0.hamster.raw', 'data_2-0.hamster.raw', 'data_9-1.hamster.raw']
这个排序键可能应该写成一个正则函数。
import re
def sortkey(string):
numbering = re.search('d+-d+', string).group()
first, second = map(int, numbering.split('-'))
return first, second
演示:
>>> a = ['data_1-0.hamster.raw',
...: 'data_0-0.hamster.raw',
...: 'data_9-1.hamster.raw',
...: 'data_2-0.hamster.raw',
...: 'data_0-1.hamster.raw',
...: 'data_0-10.hamster.raw',
...: 'data_0-2.hamster.raw']
...:
>>> sorted(a, key=sortkey)
>>>
['data_0-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-2.hamster.raw',
'data_0-10.hamster.raw',
'data_1-0.hamster.raw',
'data_2-0.hamster.raw',
'data_9-1.hamster.raw']
使用.sort((函数
a = ['data_1-0.hamster.raw',
'data_0-0.hamster.raw',
'data_9-1.hamster.raw',
'data_2-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-10.hamster.raw',
'data_0-2.hamster.raw']
a.sort()
只使用排序函数?
从Python 2.4开始,list.sort((和sorted((都添加了一个键参数,以指定在进行比较之前对每个列表元素调用的函数。
所以您有:https://repl.it/@skapin/NormalTrustworthyJumpthreading
a = ['data_1-0.hamster.raw',
'data_0-0.hamster.raw',
'data_9-1.hamster.raw',
'data_2-0.hamster.raw',
'data_0-1.hamster.raw',
'data_0-10.hamster.raw',
'data_0-2.hamster.raw']
def by_id(item):
return item.split('_')[1].split('.')[0]
a.sort(key=by_id)
print(a)
根据这个关于按多个属性排序的答案:
键可以是返回元组的函数。
我们可以简化您的RegEx,并使用将输出转换为tuple
sorted(a,key = lambda f: [int(i) for i in tuple(re.findall(r'd+',f))])