词典平等

时间:2013-06-01 03:52:24

标签: python

我有一个查找字段列表:

>>> l = ['A', 'C', 'Z', 'M']

我需要在此查找列表中测试2个字典的相等性:

>>> d1 = {'A': 3,'F': 4,'Z': 1}
>>> d2 = {'B': 0,'A': 3,'C': 7}

任何领域的平等测试' x'如果满足以下任何条件,则在列表中成功:
1.如果' x'在任何一个词组中都不存在 2.如果' x'存在且d1 [x] == d2 [x]

只有在列表中的所有字段都基于上述条件成功时,相等函数才会返回匹配。

因此,对于上述决定 - Z失败,C失败,A成功,M成功 但是,dicts的相等测试应报告失败。

实现这一目标的最短途径是什么?

3 个答案:

答案 0 :(得分:4)

这可能是最短也最优雅的:

all( d1.get(x) == d2.get(x) for x in l )

请注意,如果x不在两个字典中,我们将None与None进行比较。

编辑:
- 以下评论,使用生成器(不是列表理解) - Ashwini评论是正确的。如果其中一个词典的“无”值为

,则无效

EDIT2(以下评论):
在“无”中可以出现在字典中,您需要具有不同的“无值”。如果-9999不起作用,那么只需生成一个:

sentinel = object()     #a new object, guaranteed not in dictionary
all( d1.get(x, sentinel) == d2.get(x, sentinel) for x in l )

答案 1 :(得分:2)

试试这个:

success = True
for x in l:
  if not (((x not in d1) and (x not in d2)) or (d1.get(x) == d2.get(x))):
    success = False

答案 2 :(得分:2)

您可以使用all

>>> from itertools import chain
>>> l = ['A', 'C', 'Z', 'M']
>>> d1 = {'A': 3,'F': 4,'Z': 1}
>>> d2 = {'B': 0,'A': 3,'C': 7}

>>> all( x not in chain(d1,d2) or ((x in d1 and x in d2) and \
                                            d1.get(x) == d2.get(x))  for x in l)
False
>>> l = ['Z']
>>> d1 = {'A': 3,'F': 4,'Z': None}

>>> all( x not in chain(d1,d2) or ((x in d1 and x in d2) and  \
                                            d1.get(x) == d2.get(x))  for x in l)
False
只有当迭代的所有值都为all时,

True才会返回True,否则它将返回False。

相关问题