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

vis*_*ore 44 python dictionary

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

Sha*_*awn 89

用途all():

all(value == 0 for value in your_dict.values())
Run Code Online (Sandbox Code Playgroud)

allTrue如果给定iterable的所有元素都为true,则返回.


tim*_*geb 8

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
Run Code Online (Sandbox Code Playgroud)

无论你使用any或者all,评价都会很懒惰.all返回False它遇到的第一个假值.any返回True它遇到的第一个真值.

因此,not any(d.values())将为我提供的示例字典提供相同的结果.它比all具有生成器理解力的版本短一点.就个人而言,我仍然更喜欢all变体,因为它表达了你想要的东西,而读者不必在脑子里做出逻辑否定.

any但是在这里使用还有一个问题:

>>> d = {1:[], 2:{}, 3:''}
>>> not any(d.values())
True
Run Code Online (Sandbox Code Playgroud)

字典不包含值0,但not any(d.values())将返回,True因为所有值都是假的,即bool(value)返回False空列表,字典或字符串.

总结:可读性计数,明确,使用all解决方案.


Fan*_*chi 6

您可以使用any()方法,基本上它会检查布尔参数,但在这种情况下0将表示为False,而其他任何数字都表示为True.试试这段代码:

dict1 = {"a": 0, "b": 1}
dict2 = {"a": 0, "b": 0}

print not any(dict1.itervalues())
print not any(dict2.itervalues())
Run Code Online (Sandbox Code Playgroud)

输出:

print(not any(dict1.values()))
print(not any(dict2.values()))
Run Code Online (Sandbox Code Playgroud)

Edit2:一旁注意/警告,使用空元素列表调用any()将返回False.

  • 这将为任何假值,[],无,{}等提供不正确的结果. (3认同)
  • “ all”也很懒。 (2认同)