繁体   English   中英

高效比较python dict的所有元素

[英]Efficient comparison of all elements of python dict

我正在寻找一种更有效的方法来比较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案件这样做?

也许是这样的

>>> 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)。

[顺便说一句:不要打电话给你的清单或你的字谜 - 这会破坏内置的,而且它们很方便。

您可以使用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
>>> 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都是lasy - 在第一个False处停止,而生成器表达也是lasy :)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM