【发布时间】:2016-02-07 13:18:27
【问题描述】:
我想检查是否所有的值,即对应于字典中所有键的值都是 0。有没有办法在没有循环的情况下做到这一点?如果有怎么办?
【问题讨论】:
-
你是怎么用循环做的?
-
我遍历了字典并检查了所有值,即所有键对应的值,如果一个不正确的话,我更改了标志值并跳出了循环。
标签: python dictionary
我想检查是否所有的值,即对应于字典中所有键的值都是 0。有没有办法在没有循环的情况下做到这一点?如果有怎么办?
【问题讨论】:
标签: python dictionary
使用all():
all(value == 0 for value in your_dict.values())
all 返回 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
不管你用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 解决方案。
【讨论】:
not any 将评估为 True,因此它不同于测试所有值是否等于 0。
您可以使用[any()]1 方法,基本上它会检查布尔参数,但在这种情况下,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
编辑 2:一个旁注/警告,使用空的元素列表调用 any() 将返回 False。
编辑 3:感谢 cmets,更新了代码以反映 python 3 对字典迭代和打印功能的更改。
【讨论】:
all 也是懒惰的。
您也可以使用 any 以其他方式执行此操作:
>>> any(x != 0 for x in somedict.values())
如果它返回 True ,那么所有的键都不为 0 ,否则所有的键都是 0
【讨论】: