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

Understanding any keyword in Python if statements

我有 2 个 Python 列表如下:

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

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

这是我想出的:

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

和我expect.However一样,如果我加上any,输出变化如下:

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

any 会怎样改变输出?

你检查的方式不对

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"

因为表达式 (word in item for word in ugly)Boolean 值将始终是 True 因为它 returns 是一个 generator 对象。

您可以使用 bool 内置函数进行检查。

bool(word in item for word in ugly)

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

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

而不是:-

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

因为您的 word 字符串位于 item 字符串中。

>>> 'SNAT2VIP' in '/Common/SNAT2VIP'
True
>>> 
>>> '/Common/SNAT2VIP' in 'SNAT2VIP'
False

尝试使用 comprehension

>>>any(j for i in clean for j in ugly if i in j)
True

你的第一段代码如果有问题。生成器始终具有 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 分支。

你的论点也错了。您正在检查 "ugly" 单词是否在 "clean" 单词中。如果您为变量选择更清晰的名称,这会更加明显。以下将按预期工作:

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