我有一个文件名列表:
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)))
但是我对re语法有点困惑,这就是我得到的:
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']
似乎它对连字符后的数字起作用,而不对第一个数字起作用。
答案 0 :(得分:2)
您可以执行以下操作:
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']
答案 1 :(得分:1)
此sortkey可能应作为常规函数编写。
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']
答案 2 :(得分:0)
使用.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()
答案 3 :(得分:0)
只需使用排序功能?
从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)
答案 4 :(得分:0)
从this answer开始,按多个属性排序:
键可以是返回元组的函数。
我们可以简化您的RegEx,并使用以下命令将输出转换为tuple
:
sorted(a,key = lambda f: [int(i) for i in tuple(re.findall(r'\d+',f))])