Python 在列表中对文件进行排序
假设我有一个文件列表Python 在列表中对文件进行排序,python,Python,假设我有一个文件列表 files = ['s1.txt', 'ai1.txt', 's2.txt', 'ai3.txt'] 我需要根据它们的数量将它们分类到子列表中,以便 files = [['s1.txt', 'ai1.txt'], ['s2.txt'], ['ai3.txt']] 我可以编写一系列循环,但是我想知道是否有更好的方法来实现这一点?首先,编写一个从文件名中提取数字的函数: import itertools import re r_number = re.compile("^
files = ['s1.txt', 'ai1.txt', 's2.txt', 'ai3.txt']
我需要根据它们的数量将它们分类到子列表中,以便
files = [['s1.txt', 'ai1.txt'], ['s2.txt'], ['ai3.txt']]
我可以编写一系列循环,但是我想知道是否有更好的方法来实现这一点?首先,编写一个从文件名中提取数字的函数:
import itertools
import re
r_number = re.compile("^.*([0-9]+).*$")
def key_for_filename(filename):
# Edit: This doesn't check for missing numbers.
return r_number.match(filename).group(1)
grouped = [list(v) for k, v in
itertools.groupby(sorted(files, key=key_for_filename),
key_for_filename)]
def file_number(name):
return re.search(r"\d+", "s1.txt").group(0)
(请注意,如果名称中没有数字,则此函数将出错。)
使用此函数作为键对列表进行排序:
files.sort(key=file_number)
使用itertools.groupby()
按此键分组:
以下是一个完整的工作示例,基于: 这将产生:
[['s1.txt', 'ai1.txt'], ['s2.txt'], ['ai3.txt']]
像这样的东西会有用的
#!/usr/bin/python
from itertools import groupby
import re
import pprint
def findGroup(record):
return re.match(".*?(\d+).txt$", record).group(1)
files = [ 's1.txt', 'ai1.txt', 's2.txt', 'ai3.txt', 'foo1.txt', 'foo54.txt' ]
results = {}
for k,g in groupby(files, findGroup):
if not results.has_key(k):
results[k] = []
results[k].append([x for x in g])
pprint.pprint(results)
请注意,根据顺序,您将在列表中获得列表,但您可以很容易地折叠这些列表
示例输出:
{'1': [['s1.txt', 'ai1.txt'], ['foo1.txt']],
'2': [['s2.txt']],
'3': [['ai3.txt']],
'54': [['foo54.txt']]}
文件列表是否已按数字排序(如示例中所示)?您需要的是分组,而不是排序。我不确定如何计算组的键,但请查看下面的答案。+1我还将放置一个示例键生成函数,如
lambda x:re.sub(“[^0-9]”,“,”,x)
。此答案错误地假设列表已按数字排序。如果您进行其他假设。在这种情况下,OP甚至评论说列表不是按数字排序的。非常好的答案,它对我所做的工作非常有效。
#!/usr/bin/python
from itertools import groupby
import re
import pprint
def findGroup(record):
return re.match(".*?(\d+).txt$", record).group(1)
files = [ 's1.txt', 'ai1.txt', 's2.txt', 'ai3.txt', 'foo1.txt', 'foo54.txt' ]
results = {}
for k,g in groupby(files, findGroup):
if not results.has_key(k):
results[k] = []
results[k].append([x for x in g])
pprint.pprint(results)
{'1': [['s1.txt', 'ai1.txt'], ['foo1.txt']],
'2': [['s2.txt']],
'3': [['ai3.txt']],
'54': [['foo54.txt']]}