我在列表(filelist)中有以下文件名:
filelist = ['ABC.dat',
'ABC3.dat',
'ABC10.dat',
'ABC956.dat',
'XYZ_PQR_JKL.dat',
'XYZ_PQR_JKL_1.dat',
'XYZ_PQR3_JKL.dat',
'XYZ_PQR3_JKL_1.dat',
'XYZ_PQR10_JKL.dat',
'XYZ_PQR10_JKL_1.dat',
'XYZ_PQR956_JKL.dat',
'XYZ_PQR956_JKL_1.dat']
unique_filelist = ['ABC.dat',
'XYZ_PQR_JKL.dat',
'XYZ_PQR_JKL_1.dat',]
基本上,一组文件是在不同的时间生成的,在本例中是3、10、956,我之前就知道了。我需要根据这些时间(文件集)对文件进行分组,即应生成以下嵌套列表作为输出:
[['ABC.dat', 'ABC3.dat', 'ABC10.dat', 'ABC956.dat'],
['XYZ_PQR_JKL.dat', 'XYZ_PQR3_JKL.dat', 'XYZ_PQR10_JKL.dat', 'XYZ_PQR956_JKL.dat'],
['XYZ_PQR_JKL_1.dat', 'XYZ_PQR3_JKL_1.dat', 'XYZ_PQR10_JKL_1.dat', 'XYZ_PQR956_JKL_1.dat']]
我正在尝试将文件列表与fileset和unique\ filelist进行比较,如果它们匹配,则添加到列表中。MWE如下所示,不符合预期:
MWE
import re
filelist = ['ABC.dat',
'ABC3.dat',
'ABC10.dat',
'ABC956.dat',
'XYZ_PQR_JKL.dat',
'XYZ_PQR_JKL_1.dat',
'XYZ_PQR3_JKL.dat',
'XYZ_PQR3_JKL_1.dat',
'XYZ_PQR10_JKL.dat',
'XYZ_PQR10_JKL_1.dat',
'XYZ_PQR956_JKL.dat',
'XYZ_PQR956_JKL_1.dat']
fileset = [3, 10, 956]
unique_filelist = ['ABC.dat',
'XYZ_PQR_JKL.dat',
'XYZ_PQR_JKL_1.dat',]
for i in filelist:
for j in fileset:
search_go_to = set([unique_filelist, str(j)])
m = ' .*? '.join(x for x in search_go_to)
matches = [s for s in filelist if re.search(m, s)]
print (matches)
如何将两个列表与第三个列表进行比较,如果存在匹配项,则将它们分组到嵌套列表中?你知道吗
我的解决方案使用了一个小列表理解。你知道吗
我不得不将惟一的文件列表条目修改为regex,以显示“times”插入的位置,因为它位于basename的中间(否则)os.file.basename以及string.startswith就足够了)。你知道吗
另外,我没有使用文件集,因为它不是示例数据所必需的。如果在文件\列表中有“时间”而在文件\集中没有出现,您可以添加一个额外的过滤器。你知道吗
最后,请注意,从迭代器到列表有两种类型转换,但这只是为了打印结果。如果您处理的是大型数据集,那么最好不要使用这些数据集,然后可以以内存高效的方式迭代“result”。你知道吗
首先,从
filelist
和unique_filelist
中删除“.dat”后缀mod_filelist = [s[:-4] for s in filelist] mod_unique_filelist = [s[:-4] for s in unique_filelist]
然后,拆分
mod_filelist
上的_
项mod_filelist = [s.split('_') for s in mod_filelist]
之后,删除字母字符后面的数字
mod_filelist = [[re.sub(r"(\w)(\d)+", r"\1", sub_str) for sub_str in s] for s in mod_filelist]
合并修改后的
filelist
中每个项的子字符串mod_filelist = ['_'.join(sub for sub in s) for s in mod_filelist]
创建所需的嵌套列表,每个列表中有一个元素
result = [[unique_fname] for unique_fname in unique_filelist]
创建一个regex,将每个唯一的文件名作为一个组
filenames_re = re.compile(r'|'.join('(' + ufname + ')' for ufname in mod_unique_filelist))
最后,根据需要填充
result
for i, mod_fname in enumerate(mod_filelist): m = re.fullmatch(filenames_re, mod_fname) result[m.lastindex-1].append(filelist[i])
希望有帮助:)
相关问题 更多 >
编程相关推荐