2015-04-01 19 views
2

我有2个Python列表,内容如下:了解Python中的任意关键字if语句

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

我现在需要通过清洁每个成员进行迭代,看看它是否在任何地方丑陋的存在。 “存在”,我的意思是它可以作为一个整体存在,或者作为一个丑陋的元素存在。

这是我想出了:

>>> 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做些什么来改变输出 ?

+0

它的意思是“如果任何一个字(迭代丑陋的)内部存在项目,然后是打印,否则打印没有” – ha9u63ar 2015-04-01 13:38:57

+1

在你的第一个'if',为您打造一台发电机。你永远不会评估这个生成器,但是当一个生成器被解释为一个布尔值时,它始终是“truthy”,所以它总是如此。 – 2015-04-01 13:39:43

回答

3

当你的表达(word in item for word in ugly)Boolean值将始终是True因为它返回一个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 
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" 
+1

这只会检查单词是否在列表中,而不是它是否包含在列表中的单词之一中。 – 2015-04-01 13:42:34

+0

啊,你是对的。让我解决这个问题.. – 2015-04-01 13:43:39

1

试试这个使用的代码,如果马车comprehension

>>>any(j for i in clean for j in ugly if i in j) 
True 
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") 
+0

@ Dunes..i了解关于发电机总是返回真正的位,不管它们的值如何。但是,我不明白的是,任何与发电机一起使用,为什么我得到一个不.. – Amistad 2015-04-02 13:36:37

+0

'any'函数返回'False',因为生成器返回的所有值都是'False'。这是因为你问这些丑陋的单词是否是干净的单词,而不是干净的单词是丑陋的单词。这就是为什么我提到在未来尝试选择更好的变量名称的原因。 – Dunes 2015-04-02 18:48:30