【问题标题】:What does the builtin function any() do?内置函数 any() 有什么作用?
【发布时间】:2015-05-17 22:50:44
【问题描述】:

我在谷歌上搜索了如何检查字符串中是否包含列表中的任何元素,我发现这段代码有效:

if any(i in string for i in list):

我知道这行得通,但我真的不知道为什么。你能分享一些见解吗?

【问题讨论】:

  • any 的文档准确地描述了它的作用。哪一部分你不明白?
  • 我的猜测是,实际上让您感到困惑的不是any 函数,而是作为参数传递给它的生成器表达式。为此,请阅读 list comprehensions 上的教程部分,然后跳至 generators 和生成器表达式。
  • @abarnert 我知道,如果迭代器的任何元素为真,任何将返回真。我对 for 之前的代码部分如何适应感到困惑

标签: python if-statement syntax any


【解决方案1】:

正如any 的文档所说:

如果 iterable 的任何元素为真,则返回 True。如果 iterable 为空,则返回 False。相当于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

所以,这相当于:

for element in (i in string for i in list):
    if element:
        return True
return False

…它本身实际上等效于:

for i in list:
    element = i in string
    if element:
        return True
return False

如果您不理解最后一部分,请先阅读list comprehensions 上的教程部分,然后跳至iterators、生成器和生成器表达式。

如果你想真正分解它,你可以这样做:

elements = []
for i in list:
    elements.append(i in string)
for element in elements:
    if element:
        return True
return False

这仍然不完全相同,因为生成器表达式构建了一个生成器,而不是一个列表,但在您阅读教程部分之前,它应该足以让您继续前进。


但与此同时,拥有any 和理解等等的意义在于,您几乎可以将它们读成简单的英语:

if any(i in string for i in list): # Python

if any of the i's is in the string, for each i in the list: # pseudo-English

【讨论】:

  • 最后一部分真的帮我搞定了。谢谢!
【解决方案2】:
i in string for i in list

这会产生一个可迭代的布尔值,指示 list 中的每个项目是否在 string 中。然后检查这个布尔迭代中的任何项目是否为真。

实际上,您正在检查列表中的任何项目是否是string 的子字符串。

【讨论】:

    【解决方案3】:

    这里发生了什么:

    if any(i in string for i in list):    
    

    最好用图解来解释:

    >>> xs = ["Goodbye", "Foo", "Balloon"]
    >>> s = "Goodbye World"
    >>> [i in s for i in xs]
    [True, False, False]
    >>> any([i in s for i in xs])
    True
    

    如果您阅读any 文档,您会注意到:

    any(iterable) 如果可迭代的任何元素为真,则返回真。 如果可迭代对象为空,则返回 False。相当于:

    列表推导应该更加明显,因为它为xs 的每个元素构造了一个i in s 列表。

    基本上(用英语),您将返回搜索字符串中存在每个子字符串的任何匹配项(haystack)。

    同样重要的是要注意any() 将短路并在它找到的第一个True(ish) 值处结束。 any() 可以像这样在纯 Python 中实现:

    def any(iterable):
        for x in iterable:
            if x:
                return True
        return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 2021-07-24
      • 2014-05-06
      • 2019-06-07
      • 2010-12-22
      • 2013-01-04
      相关资源
      最近更新 更多