【发布时间】:2017-10-10 16:40:38
【问题描述】:
我想将 dict 中的所有条目与所有其他条目进行比较——如果值在足够接近的范围内,我想将它们合并到一个键下并删除另一个键。但我无法弄清楚如何在没有错误的情况下遍历 dict。
我的代码的示例版本(不是真正的值集,但你明白了):
things = { 'a': 1, 'b': 3, 'c': 22 }
for me in things.iteritems():
for other in things.iteritems():
if me == other:
continue
if abs(me-other) < 5:
print 'merge!', me, other
# merge the two into 'a'
# delete 'b'
我希望得到:
>> { 'a': [ 1, 2 ], 'c': 22 }
但是如果我运行这段代码,我会得到我想要合并的前两个:
>> merge! ('a', 1) ('b', 2)
然后是相同的反向(我想已经合并):
>> duplicate! ('b', 2) ('a', 1)
如果我使用del things['b'],我会收到一个错误,我试图在迭代时修改字典。我看到很多“如何从字典中删除项目”的问题,还有很多关于比较两个单独的字典的问题,但不是这个特定的问题(据我所知)。
编辑
根据 cmets 的反馈,我意识到我的示例有点误导。如果它们的值足够相似,我想合并两个项目。
【问题讨论】:
-
FWIW,我的实际目的是比较两个图像的感知散列,所以代码的语义不如我上面的例子。
-
您看到了什么错误?您实际上是在迭代字典中项目的笛卡尔积,即对,
(key, value) -
所以,当您比较
me == other时,您是在比较tuple对象,(key1, value1) == (key2, value2) -
请提供您想要的确切输出。应该删除哪个元素?开始的还是结束的?
-
@KaushikNP 这是一个很好的问题,但是没有开始的,也没有结束的。
dict对象本质上是无序的。
标签: python dictionary compare