理解Python if语句中的任何关键字

时间:2015-04-01 13:36:07

标签: python for-loop any

我有2个Python列表,如下所示:

>>> clean = ['SNAT2VIP', 'http2https']
>>> ugly = ['/Common/SNAT2VIP', '/Common/http2https']

我现在需要遍历每个clean成员,看看它是否存在于丑陋的任何地方。通过'exists',我的意思是它可以作为一个整体存在,或者作为丑陋元素中的substring存在。

这就是我提出的:

>>> for item in clean:
...     if (word in item for word in ugly):
...         print "yes"
...     else:
...         print "no"
...
yes
yes

按预期工作。但是,如果我添加any,则输出更改如下:

>>> for item in clean:
...     if any(word in item for word in ugly):
...         print "yes"
...     else:
...         print "no"
...
no
no

any做了什么来改变输出?

4 个答案:

答案 0 :(得分:3)

由于表达式Boolean的{​​{1}}值始终为(word in item for word in ugly),因为它返回generator个对象。

您可以使用bool内置功能进行检查。

True

因此,要使用any内置函数,您必须遵循: -

bool(word in item for word in ugly)

而不是: -

if any(item in word for word in ugly):

由于您的if any(word in item for word in ugly): 字符串位于word字符串中。

item

答案 1 :(得分:2)

你正在检查错误的方法

if any(word in item for word in ugly):

这会检查ugly中的所有字词是否也出现在clean中的每个项目中。你想检查相反的方式。改为

for word in clean:
    if any(word in item for item in ugly):
        print "yes"

答案 2 :(得分:2)

如果有错误,你的第一段代码。发生器的真值始终为True - 无论发生器可能产生的项目如何,或者发生器都不会产生任何物品。例如

>>> print("false values generator: {}".format(bool(False for item in [1])))
false values generator: True
>>> print("empty values generator truth value: {}".format(bool(True for item in [])))
empty values generator truth value: True

因此,您的代码将始终进入if语句的True分支。

你的论点也错了。你正在检查“丑陋”这个词是否在“干净”一词中。如果您为变量选择更清晰的名称,这将更加明显。以下内容将按预期工作:

for clean_word in clean:
    if any(clean_word in ugly_word for ugly_word in ugly):
        print("yes")
    else:
        print("no")

答案 3 :(得分:1)

使用comprehension

尝试此操作
>>>any(j for i in clean for j in ugly if i in j)
True