【问题标题】:How to check if all values of a dictionary are 0如何检查字典的所有值是否为0
【发布时间】:2016-02-07 13:18:27
【问题描述】:

我想检查是否所有的值,即对应于字典中所有键的值都是 0。有没有办法在没有循环的情况下做到这一点?如果有怎么办?

【问题讨论】:

  • 你是怎么用循环做的?
  • 我遍历了字典并检查了所有值,即所有键对应的值,如果一个不正确的话,我更改了标志值并跳出了循环。

标签: python dictionary


【解决方案1】:

使用all():

all(value == 0 for value in your_dict.values())

all 返回 True 如果给定的可迭代对象的所有元素都为真。

【讨论】:

    【解决方案2】:

    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 解决方案。

    【讨论】:

    • 如果所有值都为 falseynot any 将评估为 True,因此它不同于测试所有值是否等于 0
    【解决方案3】:

    您可以使用[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 对字典迭代和打印功能的更改。

    1https://docs.python.org/2/library/functions.html#any

    【讨论】:

    • all 也是懒惰的。
    • @PadraicCunningham 虽然你是对的,但他要求一个无循环的解决方案(即使在引擎盖下它仍在循环),这是我可以在没有循环的情况下给出的最好的,我在假设输入是标准化/正确的。
    • @Fanchi,根据问题的标题,我认为为任何未来的读者做出区分很重要。
    • 现在是 dict.values()
    【解决方案4】:

    您也可以使用 any 以其他方式执行此操作:

    >>> any(x != 0 for x in somedict.values())
    

    如果它返回 True ,那么所有的键都不为 0 ,否则所有的键都是 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2020-06-10
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多