我想检查是否所有的值,即与字典中所有键对应的值都是0.有没有办法没有循环?如果是这样的话?
答案 0 :(得分:75)
使用all()
:
all(value == 0 for value in your_dict.values())
如果给定iterable的所有元素都为真,则 all
返回True
。
答案 1 :(得分:7)
使用all
:
>>> d = {1:0, 2:0, 3:1}
>>> all(x==0 for x in d.values())
False
>>> d[3] = 0
>>> all(x==0 for x in d.values())
True
无论您使用any
还是all
,评估都是懒惰的。 all
会在遇到的第一个假值上返回False
。 any
会在遇到的第一个真值时返回True
。
因此,not any(d.values())
将为我提供的示例字典提供相同的结果。它比生成器理解的all
版短一点。就个人而言,我仍然更喜欢all
变体,因为它表达了你想要的东西,而读者不必在脑子里做出逻辑否定。
此处使用any
还有一个问题:
>>> d = {1:[], 2:{}, 3:''}
>>> not any(d.values())
True
字典不包含值0,但not any(d.values())
将返回True
,因为所有值都是假的,即bool(value)
返回False
表示空列表,字典或字符串。
总结:可读性计数是明确的,使用all
解决方案。
答案 2 :(得分:6)
您可以使用any()方法,基本上它会检查布尔参数,但在这种情况下0将表示为False,而其他任何数字都表示为True。 试试这段代码PY2:
dict1 = {"a": 0, "b": 1}
dict2 = {"a": 0, "b": 0}
print not any(dict1.itervalues())
print not any(dict2.itervalues())
PY3: dict1 = {" a":0," b":1} dict2 = {" a":0," b":0}
print(not any(dict1.values()))
print(not any(dict2.values()))
输出:
False
True
Edit2:一旁注意/警告,使用空元素列表调用any()将返回False。 Edit3:感谢您的评论,更新了代码以反映python 3对字典迭代和打印功能的更改。
答案 3 :(得分:2)
您也可以使用其他方式执行此操作:
>>> any(x != 0 for x in somedict.values())
如果返回True,则所有键都不为0,否则所有键都为0