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)
all
True
如果给定iterable的所有元素都为true,则返回.
用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
解决方案.
您可以使用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.