Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中对文件进行排序_Python - Fatal编程技术网

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