Python 如果文件名包含相同的关键字且文件大小大致相同,则返回filename

Python 如果文件名包含相同的关键字且文件大小大致相同,则返回filename,python,regex,list-comprehension,Python,Regex,List Comprehension,我已经在这个问题上花了相当多的时间,我觉得应该是比较直截了当的,但我想以一种计算效率高和符合Python的方式来完成这一点 我创建了两个列表:一个包含与每个文件名关联的关键字,另一个包含这些文件的文件大小,四舍五入到最接近的25字节。我试图以一种相当基本的方式识别重复文件,文件本身可能存在一些非常小的差异(在文本方面),但一般来说,一个简单的文件大小比较就可以做到这一点 到目前为止,我的方法是遍历文件名、关键字和文件大小,并返回包含重复多次的关键字和大小的文件名。请注意,我下面的当前实现并不要求

我已经在这个问题上花了相当多的时间,我觉得应该是比较直截了当的,但我想以一种计算效率高和符合Python的方式来完成这一点

我创建了两个列表:一个包含与每个文件名关联的关键字,另一个包含这些文件的文件大小,四舍五入到最接近的25字节。我试图以一种相当基本的方式识别重复文件,文件本身可能存在一些非常小的差异(在文本方面),但一般来说,一个简单的文件大小比较就可以做到这一点

到目前为止,我的方法是遍历文件名、关键字和文件大小,并返回包含重复多次的关键字和大小的文件名。请注意,我下面的当前实现并不要求重复的大小必须与该特定关键字关联(但这正是我想要的:重复的文件应该具有大致相同的文件大小,并且绝对相同的关键字)。我想我只是想得太多了,但是在这里使用字典有用吗

一些示例文件名包括:

United States vs Mexico on 4142017.txt w/ file size of 5282 bytes
Mexico vs Uruguay on 3272016.txt w/ file size of 5684 bytes
Spain vs France on 4222017.txt w/ file size of 4883 bytes
United States vs Mexico on 4152017.txt w/ file size of 5276 bytes
以下是我到目前为止所做的(我意识到这并没有像现在这样起作用):

所需的输出将是如下列表:

['United States vs Mexico on 4142017.txt','United States vs Mexico on 4152017.txt']

我认为做这类事情的标准方法是使用,形成一个字典,其中键是关键字和大小的元组,值是匹配文件名的列表

模型示例:

from collections import defaultdict

# input data as a list or sequence of tuples (keyword, size, filename):
entries = [('foo',3,'foo a'), ('bar',6,'bar b'), ('foo',3,'foo c')]

d = defaultdict(list)
for (k,v,f) in entries:
    d[(k,v)].append(f)

print [dupe for dupes in d.values() if len(dupes)>1 for dupe in dupes]
与具有更多重复关键字-大小对的条目相对应的文件名是字典中长度大于1的条目

要遍历重复项而不是显式创建列表,可以使用
itertools.chain.from\u iterable


这不是最节省内存的方法-通过在构建字典时检查字典,可以避免存储所有匹配的文件名-但它具有简单性的优点

你能写出
名称
大小
最后是什么样子吗?这里的总体思路让我走上了正确的道路,只需针对我的具体应用进行一些小的调整,谢谢!
from collections import defaultdict

# input data as a list or sequence of tuples (keyword, size, filename):
entries = [('foo',3,'foo a'), ('bar',6,'bar b'), ('foo',3,'foo c')]

d = defaultdict(list)
for (k,v,f) in entries:
    d[(k,v)].append(f)

print [dupe for dupes in d.values() if len(dupes)>1 for dupe in dupes]