为什么这个 Python "any" 函数 return 不是真的?

Why doesn't this Python "any" function return True?

我不明白为什么 any() 没有按我期望的方式工作。下面,我想说一下,如果cities列表中的任何一个城市在phrase.split()中,return True。但是,当 phrase.split() 是 ['replacement', 'windows', 'in', 'seattle', 'wa'] 并且 'seattle' 显然在 phrase.split() 列表中时,为什么 return 为假?

>>> cities = ['seattle', 'san antonio', 'denver']
>>> phrase = 'replacement windows in seattle wa'
>>> any(cities) in phrase.split()
False
>>> 'seattle' in phrase.split()
True

因为any(cities) return True,而且True不在列表中:

>>> cities = ['seattle', 'san antonio', 'denver']
>>> phrase = 'replacement windows in seattle wa'
>>> any(cities)
True
>>> True in phrase.split()
False
>>> any(cities) in phrase.split()
False

您可以使用这种方式查看列表中是否有任何城市:

>>> [i for i in cities if i in phrase.split()]
['seattle']
>>> any(i for i in phrase.split() if i in cities)
True

因为在 any(cities) 中将 return True 用于非空列表,或 False 用于空列表 - 该值永远不会包含在您的成员资格测试中.另请注意,按 space 拆分会将 san antonio 分成两个词,因此使用这种方法将无法匹配它。另一种方法是使用正则表达式:

import re

cities = ['seattle', 'san antonio', 'denver']
phrase = 'replacement windows in seattle wa'

has_city = re.compile('|'.join(sorted(cities, key=len, reverse=True))).search
if has_city(phrase):
    # do whatever

这与 if any(city in phrase for city in cities) 非常相似(它将找到 san antonio),但需要对 phrase 进行多次解析,而不是正则表达式只执行一次。

您可能还希望考虑 re.escaping 字符串并根据确切的匹配标准应用单词边界。

any(x for x in cities if x in phrase.split())

试试这个语句

any(word in phrase.split() for word in cities)

您的原始陈述并没有真正测试 "cities" 中的每个词到 "phrase.split()."

中的每个词

这是另一种正确的方法,

any(word in cities for word in phrase.split())

或者,

any(True for word in phrase.split() if word in cities)