理解Python if语句中的任何关键字
我有两个Python列表,如下所示:理解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: ..
>>> 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
。这是因为你在问丑陋的词语是否在干净的词语中,而不是干净的词语是否在丑陋的词语中。这就是为什么我提到要在将来选择更好的变量名。