我正在寻找一种快速方法来将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
有关如何提高速度的任何建议?目前它很慢。
答案 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