2011-11-21 78 views
2

我想比较一个用户输入列表中的每个元素,其中NL是列表,但由于某种原因它永远不会进入else循环。其他块从来没有执行

NL = range(1, sc.NLayer + 1) 

if (x for x in NL if x < sc.NLayer): 
    print 'true' 
else: 
    print 'false' 

sc.NLayer是用户输入。

假定sc.NLayer = 5;它没有达到其他条件。请帮忙

+0

我不明白这段代码试图检查什么。你能用简单的英语解释吗? –

+0

我可以告诉你为什么它的行为如此,但马蒂的权利:为了解决您的实际问题,我们需要了解您要做的事情,并且由于您的代码目前没有任何意义,所以如果您解释你想要什么。 – delnan

+0

我想比较用户输入到列表中的每个元素,其中NL是列表 – bharath

回答

3

您可能想要使用内置的any函数。

any([True, False, 0, []]) 
=> True 

因此,在你的代码,这将是:

if any(x for x in NL if x < sc.NLayer): 
    print 'true' 
else: 
    print 'false' 

或者可能是一个for循环:

for x in NL: 
    if x < sc.NLayer: 
     print 'true' 
    else: 
     print 'false' 
+0

当其中一个输入为“真”时,您的第一个代码示例显示为“真”。需要注意的是,不像'和'和'or','any()'和'all()'不是**合并。 –

+0

糟糕!好点子!固定。 – TorelTwiddler

2

是的,没有。

if any(x for x in NL if x <sc.NLayer): 
    print 'true' 
else: 
    print 'false' 
1

如果它不是来自其他答复清楚,你的问题就出在这里:

if (x for x in NL if x < sc.NLayer): 

在这个语法中,哟我创建了一个所谓的generator expression,它就像一个列表理解,但它返回一个生成器。发电机本身是一个复杂的物体,因此如果返回它总会评估为True。生成器有自己的协议,您必须在其中一次显式检索一个项目。迭代时,这并不是很明显,因为迭代会自动为你做这件事,但是在评估它时是不同的。相反,如果你真的将其作为列表理解来执行,你应该得到想要的结果,因为空列表([])的计算结果为False!我认为这更接近你想要的。

下面是一个简单的例子,用一个列表理解,将返回一个空列表评估mylist的内容来说明:

>>> mylist = range(10) 
>>> [x for x in mylist if x == 'a'] 
[] 

有你的空单。现在评估与bool(),可看到它是False

>>> bool([x for x in mylist if x == 'a']) 
False 

好了,如果你评估它,而不是作为发电机的表达:

>>> (x for x in mylist if x == 'a') 
<generator object <genexpr> at 0xb7ebc644> 
>>> bool((x for x in mylist if x == 'a')) 
True 

而且为了说明,如果你施放此生成器表达式到一个列表中,你可以看到它确实没有结果:

>>> list((x for x in mylist if x == 'a')) 
[] 

我希望有帮助!