1

我有一个查找字段列表:

>>> 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 的相等性测试应该报告失败。

实现这一目标的最短方法是什么?

4

3 回答 3

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 )
于 2013-06-01T04:19:47.043 回答
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
于 2013-06-01T03:54:46.610 回答
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

allTrue仅当可迭代对象的所有值都返回时才会返回,True否则它将返回 False。

于 2013-06-01T04:09:55.893 回答