【问题标题】:Return value of any() [duplicate]any() 的返回值 [重复]
【发布时间】:2020-10-20 13:36:10
【问题描述】:

我有一个关于在 Python 中返回 any 函数的值的问题。

代码如下:

def check():
   for l in lines:
       ret = any(word in l for word in list)
       return ret

它只返回一个布尔值,但我需要与列表匹配的单词。

例如:

如果我有字符串"In school they're eating for lunch a lot of unhealthy food" 和列表["lunch", "burger", "sushi"],那么我需要单词"lunch"

【问题讨论】:

  • 既然你没有指定 - 如果有多个匹配会发生什么?
  • 不幸的是,您不能直接使用anyall,这很可惜。 Clojure 具有相同的功能,但它们返回第一个/最后一个真值,这非常方便。
  • 是故意只检查lines中的第一行吗?
  • 对于每场比赛我都想知道它为什么匹配。如果字符串中有 5 次 "lunch",我想知道它匹配是因为午餐 5 次
  • @qonsycodes then any 无论如何都不是这项工作的工具,因为一旦找到第一个匹配项,它就会短路停止

标签: python any


【解决方案1】:

在 Python 3.8 中,赋值表达式可用于捕获导致any 返回True见证

for l in lines:
    if any((x:=word) in l for word in list):
        return x

如果any返回True,那是因为word的值(赋值给x)导致word in l为真。 xword 绑定在不同的范围内:word 在生成器表达式的范围内,x 在定义生成器表达式的范围内。

【讨论】:

  • 太棒了。只是为了确认,这不应该破坏短路,对吧?
  • 正确;每次分配word 时,基本上都会为x 分配一个新值。您返回的值是 wordany 停止迭代生成器之前取得的最后一个值。
  • 应该等价于for word in list: if word in l: return word
  • 有点回归到 Python 2 天,其中 list-comp/gen-expression 变量“泄露”到一般范围 :)
  • 这正是我想要的!谢谢
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2018-03-01
  • 2023-03-06
相关资源
最近更新 更多