Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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_Python 3.x_List_Tuples - Fatal编程技术网

在python中,如何将列表中类似命名的元素分组到元组中?

在python中,如何将列表中类似命名的元素分组到元组中?,python,python-3.x,list,tuples,Python,Python 3.x,List,Tuples,我已经在python列表中读取了目录中所有文件的名称,如下所示: files = ['ch1.txt', 'ch2.txt', 'ch3_1.txt', 'ch4_2.txt', 'ch3_2.txt', 'ch4_1.txt'] 我要做的是将类似的文件分组为列表中的元组。上面的例子应该是这样的 files_grouped = ['ch1.txt', 'ch2.txt', ('ch3_1.txt', 'ch3_2.txt'), ('ch4_1.txt', 'ch4_2.txt')] 我尝试

我已经在python列表中读取了目录中所有文件的名称,如下所示:

files = ['ch1.txt', 'ch2.txt', 'ch3_1.txt', 'ch4_2.txt', 'ch3_2.txt', 'ch4_1.txt'] 
我要做的是将类似的文件分组为列表中的元组。上面的例子应该是这样的

files_grouped = ['ch1.txt', 'ch2.txt', ('ch3_1.txt', 'ch3_2.txt'), ('ch4_1.txt', 'ch4_2.txt')]
我尝试过的一种方法是将需要分组的元素从列表中分离出来,如下所示

groups = tuple([file for file in files if '_' in file])
single = [file for file in files if not '_' in file]

我会创建一个新的列表,将两者都添加到后面。但是我如何创建
组作为
ch3
ch4
的元组列表,比如
[('ch3_1.txt','ch3_2.txt'),('ch4_1.txt','ch4_2.txt')]
而不是一个大元组?

也许您可以对文件名列表进行排序,然后使用:

e、 g

结果:

[('ch1.txt',), ('ch2.txt',), ('ch3_1.txt', 'ch3_2.txt'), ('ch4_1.txt', 'ch4_2.txt')]
defaultdict(<class 'list'>,
            {'ch1': ['ch1.txt'],
             'ch2': ['ch2.txt'],
             'ch3': ['ch3_1.txt', 'ch3_2.txt'],
             'ch4': ['ch4_2.txt', 'ch4_1.txt']})

希望这能有所帮助。

没有一个答案能为您提供适用于任何类型文件名的通用解决方案。我认为你应该使用正则表达式,如果你想解释的话

import itertools
import re

sorted_files = sorted(files, key=lambda x: re.findall('(\d+)_(\d+)', x))    
out = [list(g) for _, g in itertools.groupby(sorted_files, 
                       key=lambda x: re.search('\d+', x).group() )]

print(out)
[['ch1.txt'],
 ['ch2.txt'],
 ['ch3_1.txt', 'ch3_2.txt'],
 ['ch4_1.txt', 'ch4_2.txt']]
请注意,这应该适用于任何命名格式,而不仅仅是
chX\u X

如果您希望输出的格式与描述的完全相同,您可以进行一些额外的后处理:

out = [o[0] if len(o) == 1 else tuple(o) for o in out]
print(out)
['ch1.txt', 'ch2.txt', ('ch3_1.txt', 'ch3_2.txt'), ('ch4_1.txt', 'ch4_2.txt')]

正则表达式详细信息

第一个正则表达式按章节和小节进行分类

(       # first group 
\d+     # 1 or more digits
)
_       # literal underscore
(       # second group
\d+     # 1 or more digits
)

第二个正则表达式仅按章节进行分组-具有相同章节的所有章节都分组在一起。

您可以使用字典(或者,为了更简单地初始化
集合。defaultdict

from collections import defaultdict
from pprint import pprint

files = ['ch1.txt', 'ch2.txt', 'ch3_1.txt', 'ch4_2.txt', 'ch3_2.txt', 'ch4_1.txt']

grouped = defaultdict(list)  # create an empty list for not existent entries

for f in files:
    key = f[:3]
    grouped[key].append(f)

pprint(grouped)
结果:

[('ch1.txt',), ('ch2.txt',), ('ch3_1.txt', 'ch3_2.txt'), ('ch4_1.txt', 'ch4_2.txt')]
defaultdict(<class 'list'>,
            {'ch1': ['ch1.txt'],
             'ch2': ['ch2.txt'],
             'ch3': ['ch3_1.txt', 'ch3_2.txt'],
             'ch4': ['ch4_2.txt', 'ch4_1.txt']})
那是

[('ch1.txt',),
 ('ch2.txt',),
 ('ch3_1.txt', 'ch3_2.txt'),
 ('ch4_2.txt', 'ch4_1.txt')]

谢谢,我能够在我的代码中采用这个解决方案,它对我很有效。