Python 比较字典中所有值的最有效方法?

Python 比较字典中所有值的最有效方法?,python,dictionary,Python,Dictionary,我有一本字典,是我通过阅读大量图像文件创建的。看起来是这样的: files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]} { 'file1.png': ['file1.png', 'file23.png', 'file333.png'], 'file2.png': ['file2.png'], 'file3.png': ['file3.png', 'file4.png', '

我有一本字典,是我通过阅读大量图像文件创建的。看起来是这样的:

files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]}
{ 'file1.png': ['file1.png', 'file23.png', 'file333.png'],
  'file2.png': ['file2.png'],
  'file3.png': ['file3.png', 'file4.png', 'file5.png'],
  'file4.png': ['file3.png', 'file4.png', 'file5.png'],
  ...}
file1.png file23.png file33.png
file2.png
file3.png file4.png file5.png
file6.png
...
我试图处理这些图像,看看它们彼此有多相似。问题是,由于1000个文件的数据价值,这需要花费很长时间。我肯定我有20个不同的地方可以优化,但我正试图一次一个地完成它,看看如何更好地优化它

我最初的方法将file1与所有其他文件进行了测试。然后我针对所有文件测试了file2。但我还是用file1测试了它。因此,在上面的例子中,当我到达file1000时,我甚至不需要在那一点上测试任何东西,因为它已经被测试了999次

这就是我所尝试的:

answers = {}
for x in files:
    for y in files:
        if y not in answers or x not in answers[y]:
            if(compare(files[x],files[y]) < 0.01):
                answers.setdefault(x, []).append(y)
我只是不想把这个巨大的等式放到if语句中

有没有人有一个好方法来比较文件字典中的每个数据段而不重叠比较

编辑:

在尝试了暗影游侠的答案后,我意识到我可能还没有完全理解我需要什么。我的原始答案词典如下所示:

files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]}
{ 'file1.png': ['file1.png', 'file23.png', 'file333.png'],
  'file2.png': ['file2.png'],
  'file3.png': ['file3.png', 'file4.png', 'file5.png'],
  'file4.png': ['file3.png', 'file4.png', 'file5.png'],
  ...}
file1.png file23.png file33.png
file2.png
file3.png file4.png file5.png
file6.png
...
现在,我将结果存储在如下文件中:

files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]}
{ 'file1.png': ['file1.png', 'file23.png', 'file333.png'],
  'file2.png': ['file2.png'],
  'file3.png': ['file3.png', 'file4.png', 'file5.png'],
  'file4.png': ['file3.png', 'file4.png', 'file5.png'],
  ...}
file1.png file23.png file33.png
file2.png
file3.png file4.png file5.png
file6.png
...

我认为,通过使用组合和只测试单个文件一次,我将节省大量时间重新测试文件,而不必浪费时间消除重复的答案。但据我所知,这些组合实际上降低了我查找匹配项的能力,我不知道为什么。

你可以避免重复比较。只需导入itertools并替换双嵌套循环:

for x in files:
    for y in files:
使用一个获得组合的循环:

for x, y in itertools.combinations(files, 2):

在dict视图上使用set操作,即dict.keys()或dict.items()。@pylang没有重复的文件,即keys,我不想删除任何数据集,因为我想查看哪些文件彼此相似。编辑:如果你指的是答案,那就是我开始的地方。但是,当我将数据集增加到1000个文件时,我在运行5分钟后退出了该程序。如果您正在处理图像,那么将所有文件加载到内存中真的安全吗?你说你可以有几千个文件,但是你真的把一千个图像的原始数据放在字典里了吗?如果这些应该是图标或这样小的图像,那么它是好的。。。但是有了照片,你的电脑应该会爆炸(除非Python有我不知道的魔力)。旁注:
functools.reduce(add…)
是一种不必要的复杂方式来做
sum(…)
。如果需要使用
lambda
函数,则千万不要使用
map
;它将比等效的生成器表达式/列表理解更慢,可读性更低,因此您可以将
rms
的计算简化为等效的,并且可能更快:
(sum((a-b)**2表示a,b在zip中(h1[0],h2[0])/len表示(h1[0])**0.5
@rightleeg我在它进入字典之前做了一些预处理。现在我正在存储图像的直方图。这是我保留比较函数的另一个原因。我将来可能会实现一个更好的比较函数。是的,这应该可以工作,因为来自
组合的迭代器不应该占用内存,而且一次只能比较两个文件。很好。我打印了这些组合,除了没有得到正确的输出外,它看起来很有效。我想我犯了一个严重的错误…@ShadowRanger我想我可能发现了问题。我也需要它与自身相匹配。至少按照我设置答案字典的方式,我需要让每个文件都有一个正匹配,即使这意味着它只与自身匹配。@ShadowRanger我继续使用稍大一点的数据集进行了尝试,以查看我会得到什么样的结果。这个方法肯定不能像我想的那样工作。我已经更新了原来的问题,希望有人能帮我指出正确的方向。@user1362058:如果您要避免重复测试,并且想要进行正向和反向映射,则只需在命中时进行这两种映射,例如,除了
answers.setdefault(x,[]).append(y)
,您还可以执行
answers.setdefault(y,[])。append(x)