为什么这个Python“any”函数不返回True?

时间:2015-02-02 03:59:19

标签: python string python-3.x any

我不明白为什么任何()没有像我期望的那样工作。下面,我想说,如果城市列表中的任何城市都在短语.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

5 个答案:

答案 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)