python - 在两个文件夹中查找名称首字母相同的文件

标签 python list set-intersection

我使用listdir读取了两个文件夹中的文件:

from os import listdir 
list_1 = [file for file in listdir("./folder1/") if file.endswith(".csv")]
list_2 = [file for file in listdir("./folder2/") if file.endswith(".json")]

现在我有两个列表:

list_1 = ['12_a1_pp.csv', '32_a3_pp.csv', '45_a17_pp.csv', '81_a123_pp.csv']
list_2 = ['12_a1.json', '32_a3.json', '61_a54.json']

我想找到相应的两个子列表,其中包含那些名称的初始部分相同的文件。换句话说:

list_1b = ['12_a1_pp.csv', '32_a3_pp.csv']
list_2b = ['12_a1.json', '32_a3.json']

我该怎么做?

请注意,listdir 部分可能与回答问题无关紧要。我只包含它,因为如果 listdir 的结果保证按字母顺序排列,那么这可能有助于遍历这两个列表。当然,在这个简单的示例中,列表很短,但在实际用例中,它们包含数百个文件。

最佳答案

一个更 pythonic 的方法是对集合使用 &(交集)运算符:

common = set(x[:-7] for x in list_1) & set(x[:5] for x in list_2)
list_1b = [x + '_pp.csv' for x in common]
list_2b = [x + '.json' for x in common]

编辑:如果您需要为每个列表拆分特定字符(请参阅评论),这里是更新版本(搜索 list_1 中的最后一个“_”并搜索 list_2 中的最后一个“.”):

common = set(x[:x.rindex('_')] for x in list_1) & set(x[:x.rindex('.')] for x in list_2)

关于python - 在两个文件夹中查找名称首字母相同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733101/

相关文章:

python - 我如何创建类似于 "set intersection"的东西,允许一个项目从单个集合中丢失 n/1 次或更多次?

python - Ansible - 如何从列表中删除项目?

python - 使用python numpy在3d空间中找到一个点的k个最近邻居

java - 如何使用对象名称字段按字母顺序对 List<Object> 进行排序

list - 在 Raku 中查找列表中第一个出现的 1 位数字

python - 查找集合列表中所有集合中出现的元素

python - 为什么在 Python 中创建一个类比实例化一个类要慢得多?

python - 如何匹配 'K' , 'M' , 'G' , 'Ki' , 'Mi' , 'Gi' 等但不是单独的 'i' 词缀

list - 如何将函数仅映射到列表中的某些元素?

r - 从翻转对象中提取交叉点列表