我有一个查找字段列表:
>>> 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的相等测试应报告失败。
实现这一目标的最短途径是什么?
答案 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。