【问题标题】:Check if any item in Python list is None (but include zero)检查 Python 列表中的任何项目是否为无(但包括零)
【发布时间】:2015-03-04 00:12:59
【问题描述】:

我正在尝试做一个简单的测试,如果列表的任何结果是None,则返回True。但是,我希望 0'' 不会导致返回 True

list_1 = [0, 1, None, 4]
list_2 = [0, 1, 3, 4]

any(list_1) is None
>>>False
any(list_2) is None
>>>False

如您所见,any() 函数在这种情况下没有帮助。

【问题讨论】:

  • 请注意,当前代码的意思是 "如果我对 any 的调用结果恰好是 None"(假设它会返回 TrueFalseraise 例外,将永远不会发生)。

标签: python


【解决方案1】:

对于list 对象可以简单地使用成员资格测试:

None in list_1

any() 一样,list 上的成员资格测试将扫描除短路之外的所有元素,并在找到匹配项后立即返回。

any() 返回TrueFalse,从不返回None,所以你的any(list_1) is None 测试肯定不会去任何地方。您必须传入一个生成器表达式以供 any() 迭代,而不是:

any(elem is None for elem in list_1)

【讨论】:

  • 我会引用任何Return True if any element of the iterable is true. If the iterable is empty, return False. 所以这确实不是正确的使用方式
  • @d6bels 不完全是。这是any() 的一个非常自然的用例,您只需要将它与生成器表达式结合起来。 in 在这种情况下很好,list_1 实际上是 List - 在某些情况下,如果没有实现 __contains__(),它可能是任意可迭代的,在这种情况下,any() 解决方案将是最佳选择。
  • 当列表包含 Numpy 数组时,这会产生麻烦。 Tom Corneize 有一个更好的解决方案。
  • @frankliuao:但在 numpy 数组上,无论如何您都可能希望使用 numpy.any(),而不是将 None 对象存储在数值数组中。
  • 请注意,如果列表元素之一是numpy 数组,这不起作用。在这种情况下,首先在数组上使用list()
【解决方案2】:
list_1 = [0, 1, None, 4]

list_2 = [0, 1, 3, 4]

any(x is None for x in list_1)
>>>True

any(x is None for x in list_2)
>>>False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多