繁体   English   中英

嵌套列表上的 Python any() 函数返回不正确的值

[英]Python any() function on nested list returning incorrect value

您好,我正在尝试在 python 中使用 any() 函数。 通过阅读文档,该函数应该在列表中有 True 时返回 True。 然而,在我下面的嵌套列表中,尽管列表中没有 True 值,但函数返回 true。

b = [[False, False], [False, False]]
print(any(b))

打印True

如果列表中的所有值都为 False,我试图返回 False,如果任何值为 True,则返回 True,因此否定它是行不通的。 我该如何解决? 感谢您的帮助。

怎么办

any(any(x) for x in b)

这将检查列表中的每个列表是否为 True,然后检查这些结果中是否有任何一个为 True

您可以使用itertools 中的chain.from_iterable来展平嵌套列表。 如果你把它传递给any ,你会得到你想要的结果。 这适用于任何级别的嵌套,而不仅仅是两个。

>>> from itertools import chain
>>> b = [[False, False], [False, False]]
>>> any(chain.from_iterable(b))
False
>>> c = [[False, False], [False, True]]
>>> any(chain.from_iterable(c))
True

假设您只处理一层嵌套,您可以简单地map any() map到列表项上并采用其中的any()

b = [[False, False], [False, False]]
any(map(any, b))
# False

c = [[False, False], [False, True]]
any(map(any,c))
# True

当然,如果您的项目可以任意嵌套,您需要多几行代码。

b = [[False, False], False, [False, [False, True]]]
c = [[False, False], False, [False, [False, False]]]

def any_nested(item):
     if not isinstance(item, list):
        return bool(item)
     return any(map(any_nested, item))

any_nested(b)
# True
any_nested(c)
# False

如果传递的列表中的任何元素为真,则 any() 函数返回真

在您的情况下,您有两个嵌套列表,并且您在主列表上调用any() 从技术上讲,您的主要列表是True ,因为它包含两个具有元素的列表。

# Empty list returns False as no elements exist   
bool([])
False
# List with one element returns True
bool([0])
True
# Even with the list containing False, the list is `True` because it contains an element.
bool([False])
True

any()接受一个可迭代对象,并检查所述可迭代对象中是否有任何值是TrueFalse

您传递两个列表,每个列表中都有一个元素,导致返回True ,您的代码从未实际检查嵌套列表中的值是True还是False

bool([False, False])
True

如果您迭代嵌套列表的内容,您将得到False的返回

for item in b:
    any(item)


False
False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM