我想比较一个用户输入列表中的每个元素,其中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
;它没有达到其他条件。请帮忙
我想比较一个用户输入列表中的每个元素,其中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
;它没有达到其他条件。请帮忙
您可能想要使用内置的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'
当其中一个输入为“真”时,您的第一个代码示例显示为“真”。需要注意的是,不像'和'和'or','any()'和'all()'不是**合并。 –
糟糕!好点子!固定。 – TorelTwiddler
是的,没有。
if any(x for x in NL if x <sc.NLayer):
print 'true'
else:
print 'false'
如果它不是来自其他答复清楚,你的问题就出在这里:
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'))
[]
我希望有帮助!
我不明白这段代码试图检查什么。你能用简单的英语解释吗? –
我可以告诉你为什么它的行为如此,但马蒂的权利:为了解决您的实际问题,我们需要了解您要做的事情,并且由于您的代码目前没有任何意义,所以如果您解释你想要什么。 – delnan
我想比较用户输入到列表中的每个元素,其中NL是列表 – bharath