将一个dict值与所有dict值的dict值进行比较

时间:2017-10-05 21:31:37

标签: python dictionary iteration

我正在寻找一种快速方法来将dict的一个值与所有值进行比较,并希望遍历dict的所有值。

我知道价值检查会有很多重复,所以 我试图在迭代期间更新iterable(pop已经迭代的键),但似乎我无法在迭代期间修改iterable。

以下是我使用的代码:

#comparing value to all value2

duplicates = []
for key,value in image_dict_copy.items():
    for key2,value2 in image_dict_copy.items():
        if hamming_distance(value, value2) > .85:
            duplicates.append((key, key2))
        image_dict_copy.pop(key)  #doesn't work
        print(len(image_dict_copy)) #trying to shrink the size of the iterable

有关如何提高速度的任何建议?目前它很慢。

1 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,但实质上,你想比较你的dict中每一对可能的键。最简单的方法是不重新发明轮子并使用itertools:

import itertools
for k1, k2 in itertools.combinations(image_dict_copy, 2):
    if hamming_distance(image_dict_copy[k1], image_dict_copy[k2]) > .85:
        duplicates.append((k1, k2))

现在,计算复杂性仍然是二次方的,但是你实际上只进行了一半的实际比较。

itertools.combinations非常方便,因为它需要任何可迭代的。但是如果你有一个序列,即list,这是迭代每个唯一对的基本方法(通过索引):

>>> keys = list('abcde')
>>> for i in range(len(keys)):
...     for j in range(i + 1, len(keys)):
...         print(keys[i], keys[j])
...
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e

如果您执行了类似

的操作,则可以使用上述方法
keys = list(image_dict_copy)

但坚持使用itertools

只是为了好玩,如果真的想要使用pop,请向后迭代向后并从后面弹出:

>>> keys = list('abcde')
>>> keys_copy = keys[:-1]
>>> for k1 in reversed(keys):
...     for k2 in reversed(keys_copy):
...         print(k1, k2)
...     if keys_copy:
...         _ = keys_copy.pop()
...
e d
e c
e b
e a
d c
d b
d a
c b
c a
b a