我有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
做了什么来改变输出?
答案 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