我不明白为什么任何()没有像我期望的那样工作。下面,我想说,如果城市列表中的任何城市都在短语.split()中,则返回True。但是当phrase.split()是['replacement', 'windows', 'in', 'seattle', 'wa']
和' seattle'时,为什么它会返回false。显然在短语.split()列表中?
>>> cities = ['seattle', 'san antonio', 'denver']
>>> phrase = 'replacement windows in seattle wa'
>>> any(cities) in phrase.split()
False
>>> 'seattle' in phrase.split()
True
答案 0 :(得分:5)
Becuse any(cities)
返回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
答案 1 :(得分:3)
因为在any(cities)
中会为非空列表返回True
,或者为空列表返回False
- 因此您的成员资格测试中不会包含该值。另请注意,按空格分割会将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
字符串并根据匹配的准确标准应用字边界。
答案 2 :(得分:1)
试试这句话
any(word in phrase.split() for word in cities)
您的原始陈述并未真正测试“cities.split()中每个字词的”城市“中的每个字词。”
答案 3 :(得分:0)
any(x for x in cities if x in phrase.split())
答案 4 :(得分:0)
这是另一种正确的方法,
any(word in cities for word in phrase.split())
或者,
any(True for word in phrase.split() if word in cities)