我正在寻找一种更有效的方法来比较python dict的所有元素。
这是我正在做的psuedocode:
for key1 in dict:
for key2 in dict:
if not key1 == key2:
compare(key1,key2)
如果dict的长度为N,则为N ^ 2 - N.有没有办法不重复第二个循环中的元素?对于列表,这将是:
N = len(list)
for i in range(1:(N-1)):
for j in range((i+1):N):
compare(list[i], list[j])
无论如何为dict案件做这件事?
答案 0 :(得分:9)
也许像
>>> import itertools
>>>
>>> d = {1:2, 2:3, 3:4}
>>>
>>> for k0, k1 in itertools.combinations(d,2):
... print 'compare', k0, k1
...
compare 1 2
compare 1 3
compare 2 3
如果你不关心你是否得到(1,2)或(2,1)。 [当然,如果你想要一个特定的订单,你可以迭代sorted(d)
或某个变体,或者如果重要的话,你可以比较(k0,k1)和(k1,k0)。]
[顺便说一下:不要打电话给你的清单或你的字谜 - 破坏内置组件,它们很方便。]
答案 1 :(得分:3)
您可以使用OrderedDict,然后编写类似于您已经为列表获得的代码。
以下是一个例子:
from collections import OrderedDict
def compare(a, b):
print "compare", a, b
d = OrderedDict([('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2)])
for key1 in d:
for key2 in reversed(d):
if key1 == key2:
break
compare(key1, key2)
当我运行它时会打印:
compare banana orange
compare banana pear
compare banana apple
compare apple orange
compare apple pear
compare pear orange
答案 2 :(得分:0)
>>> equal = lambda d1, d2: all(d1.get(k) == d2.get(k) for k in set(d1.keys() + d2.keys()))
>>> print equal({'a':1, 'b':2}, {'b':2, 'a':1})
True
>>> print equal({'a':1, 'b':2}, {'b':2, 'a':2})
False
此解决方案非常有效:all
是女士 - 在第一个False
停止,生成器表达也是女士:)
def deep_equal(d1, d2):
''' Deep comparison '''
if type(d1) != type(d2):
return False
if isinstance(d1, dict):
return all(ddeep_equal(d1.get(k), d2.get(k))
for k in set(d1.keys() + d2.keys()))
return d1 == d2