gpt4 book ai didi

python - 如何将列表中名称相似的元素分组为 python 中的元组?

转载 作者:行者123 更新时间:2023-11-28 21:03:40 25 4
gpt4 key购买 nike

我已经读取了 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]

然后我会创建一个新列表来附加两者。但是我如何创建 groups 作为 ch3ch4 的元组列表,如 [('ch3_1.txt', 'ch3_2 .txt'), ('ch4_1.txt', 'ch4_2.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_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
)

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

关于python - 如何将列表中名称相似的元素分组为 python 中的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46293852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com