2024-04-19 06:11:26 发布
网友
我试图将用户输入与列表的每个元素进行比较,其中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
假设sc.NLayer = 5;它没有达到else条件。请帮忙
sc.NLayer = 5
如果从其他答复中看不清楚,您的问题在于:
if (x for x in NL if x < sc.NLayer):
在这个语法中,您创建了被称为generator expression的内容,这类似于列表理解,但是它返回一个生成器。生成器本身是一个复杂的对象,因此如果返回,它将始终计算为True。生成器有自己的协议,您必须在其中一次显式检索一个项。在迭代时,这不是很明显,因为迭代会自动为您执行,但在计算它时是不同的。你知道吗
True
相反地,如果您要将此作为列表理解来执行,则应该得到所需的结果,因为空列表([])的计算结果是False!我觉得这更接近你想要的。你知道吗
[]
False
下面是一个简单的示例,通过使用返回空列表的列表理解来评估mylist的内容:
mylist
>>> mylist = range(10) >>> [x for x in mylist if x == 'a'] []
这是你的空名单。现在用bool()评估它,并观察它是False:
bool()
>>> 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')) []
我希望这有帮助!你知道吗
是的,不
if any(x for x in NL if x <sc.NLayer): print 'true' else: print 'false'
您可能需要使用内置的any函数。你知道吗
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'
如果从其他答复中看不清楚,您的问题在于:
在这个语法中,您创建了被称为generator expression的内容,这类似于列表理解,但是它返回一个生成器。生成器本身是一个复杂的对象,因此如果返回,它将始终计算为
True
。生成器有自己的协议,您必须在其中一次显式检索一个项。在迭代时,这不是很明显,因为迭代会自动为您执行,但在计算它时是不同的。你知道吗相反地,如果您要将此作为列表理解来执行,则应该得到所需的结果,因为空列表(
[]
)的计算结果是False
!我觉得这更接近你想要的。你知道吗下面是一个简单的示例,通过使用返回空列表的列表理解来评估
mylist
的内容:这是你的空名单。现在用
bool()
评估它,并观察它是False
:好吧,那么如果将其作为生成器表达式进行求值呢:
为了举例说明,如果您将这个生成器表达式转换为一个列表,您可以看到它实际上没有任何结果:
我希望这有帮助!你知道吗
是的,不
您可能需要使用内置的
any
函数。你知道吗所以在你的代码里,应该是:
或者可能是for循环:
相关问题 更多 >
编程相关推荐