如何在Python中检查字典的所有值是否为0?

时间:2016-02-07 13:18:28

标签: python dictionary

我想检查是否所有的值,即与字典中所有键对应的值都是0.有没有办法没有循环?如果是这样的话?

4 个答案:

答案 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会在遇到的第一个假值上返回Falseany会在遇到的第一个真值时返回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