如何将两个列表与第三个列表进行比较,如果存在匹配项,如何在Python中将它们分组到嵌套列表中?

2024-09-28 01:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在列表(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)

如何将两个列表与第三个列表进行比较,如果存在匹配项,则将它们分组到嵌套列表中?你知道吗


Tags: 文件in列表forjkldatuniqueabc
2条回答

我的解决方案使用了一个小列表理解。你知道吗

我不得不将惟一的文件列表条目修改为regex,以显示“times”插入的位置,因为它位于basename的中间(否则)os.file.basename以及string.startswith就足够了)。你知道吗

另外,我没有使用文件集,因为它不是示例数据所必需的。如果在文件\列表中有“时间”而在文件\集中没有出现,您可以添加一个额外的过滤器。你知道吗

最后,请注意,从迭代器到列表有两种类型转换,但这只是为了打印结果。如果您处理的是大型数据集,那么最好不要使用这些数据集,然后可以以内存高效的方式迭代“result”。你知道吗

import re

file_list = ['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_file_list = [r'ABC\d*.dat',
                    'XYZ_PQR\d*_JKL.dat',
                    'XYZ_PQR\d*_JKL_1.dat', ]

def unique_list():
    for unique in unique_file_list:
        yield list(file for file in file_list if re.match(unique, file))

print(list(unique_list()))
  1. 首先,从filelistunique_filelist中删除“.dat”后缀

    mod_filelist = [s[:-4] for s in filelist] mod_unique_filelist = [s[:-4] for s in unique_filelist]

  2. 然后,拆分mod_filelist上的_

    mod_filelist = [s.split('_') for s in mod_filelist]

  3. 之后,删除字母字符后面的数字

    mod_filelist = [[re.sub(r"(\w)(\d)+", r"\1", sub_str) for sub_str in s] for s in mod_filelist]

  4. 合并修改后的filelist中每个项的子字符串

    mod_filelist = ['_'.join(sub for sub in s) for s in mod_filelist]

  5. 创建所需的嵌套列表,每个列表中有一个元素

    result = [[unique_fname] for unique_fname in unique_filelist]

  6. 创建一个regex,将每个唯一的文件名作为一个组

    filenames_re = re.compile(r'|'.join('(' + ufname + ')' for ufname in mod_unique_filelist))

  7. 最后,根据需要填充result

    for i, mod_fname in enumerate(mod_filelist): m = re.fullmatch(filenames_re, mod_fname) result[m.lastindex-1].append(filelist[i])

希望有帮助:)

相关问题 更多 >

    热门问题