Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Python if语句中的任何关键字_Python_For Loop_Any - Fatal编程技术网

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

理解Python if语句中的任何关键字,python,for-loop,any,Python,For Loop,Any,我有两个Python列表,如下所示: >>> clean = ['SNAT2VIP', 'http2https'] >>> ugly = ['/Common/SNAT2VIP', '/Common/http2https'] >>> for item in clean: ... if any(word in item for word in ugly): ... print "yes" ... else: ..

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

>>> clean = ['SNAT2VIP', 'http2https']
>>> ugly = ['/Common/SNAT2VIP', '/Common/http2https']
>>> for item in clean:
...     if any(word in item for word in ugly):
...         print "yes"
...     else:
...         print "no"
...
no
no
我现在需要遍历clean的每个成员,看看它是否存在于丑陋的世界中的任何地方。所谓“存在”,我的意思是它可以作为一个整体存在,也可以作为一个子串存在于一个丑陋的元素中

这就是我想到的:

>>> for item in clean:
...     if (word in item for word in ugly):
...         print "yes"
...     else:
...         print "no"
...
yes
yes
按预期工作。但是,如果我添加
any
,则输出更改如下:

>>> clean = ['SNAT2VIP', 'http2https']
>>> ugly = ['/Common/SNAT2VIP', '/Common/http2https']
>>> 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):
这将检查
globe
中的所有单词是否也出现在
clean
中的每个项目中。你想从另一个方向看看。改为

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

由于表达式的
布尔值
(单词在条目中,单词在丑陋中)
在返回对象时将始终为
True

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

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):
因为您的
单词
字符串位于
字符串中

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

使用
理解

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

你的第一段代码如果有bug。生成器的真值始终为
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语句的真正分支

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

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

它的意思是“如果项目中存在任何单词(在丑陋中迭代),则打印“是”,否则打印“否”。在第一个
中,如果
,则创建一个生成器。您永远不会计算该生成器,但当生成器被解释为布尔值时,它总是“truthy”,因此它总是true。这只检查该单词是否在列表中,而不是它是否包含在该列表中的某个单词中。@Dunes..我理解关于生成器总是返回true的部分,而不管其中的值如何..但是,我不明白的是,对于与生成器一起使用的any,为什么我会得到一个no.
any
函数返回了
False
,因为生成器返回的所有值都是
False
。这是因为你在问丑陋的词语是否在干净的词语中,而不是干净的词语是否在丑陋的词语中。这就是为什么我提到要在将来选择更好的变量名。