了解 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")
我有 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")