我正在尝试将用户输入与列表中的每个元素进行比较,其中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 :(得分: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'
答案 1 :(得分:2)
是的,没有。
if any(x for x in NL if x <sc.NLayer):
print 'true'
else:
print 'false'
答案 2 :(得分: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'))
[]
我希望有所帮助!