Python 嵌套列表理解

Python 嵌套列表理解,python,list,syntax,list-comprehension,Python,List,Syntax,List Comprehension,我试着将外部列表理解的价值用于内部列表理解: [ x for x in range(y) for y in range(3) ] 但不幸的是,这会引发名称错误,因为名称y未知(尽管外部列表指定了它) 这是Python的一个限制(尝试了2.7.3和3.2.3)还是有一个很好的理由说明它不能工作 是否有计划取消限制 是否有变通方法(一些不同的语法可能我没有弄明白)来实现我想要的?您所说的是列表理解,而不是生成器表达式 您需要交换for循环: [ x for y in range(3) for x

我试着将外部列表理解的价值用于内部列表理解:

[ x for x in range(y) for y in range(3) ]
但不幸的是,这会引发名称错误,因为名称
y
未知(尽管外部列表指定了它)

这是Python的一个限制(尝试了2.7.3和3.2.3)还是有一个很好的理由说明它不能工作

是否有计划取消限制


是否有变通方法(一些不同的语法可能我没有弄明白)来实现我想要的?

您所说的是列表理解,而不是生成器表达式

您需要交换for循环:

[ x for y in range(3) for x in range(y) ]
您需要像在常规循环中嵌套一样阅读这些内容:

for y in range(3):
    for x in range(y):
        x
具有多个循环的列表理解遵循相同的顺序。见:

当提供列表理解时,它包括一个表达式,后跟至少一个
for
子句和零个或多个
for
if
子句。在这种情况下,新列表的元素是通过将
for
if
子句中的每一个考虑为块,从左到右嵌套,并在每次到达最里面的块时计算表达式以生成列表元素而产生的元素

当然,生成器表达式也是如此,但它们使用括号而不是方括号,并且不会立即具体化:

>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]
>>(x代表范围(3)中的y,x代表范围(y))
>>>[x代表范围(3)中的y,x代表范围(y)]
[0, 0, 1]
只需嵌套另一代即可

[ x for x in [range(y) for y in range(3) ]]
给我:

[[], [0], [0, 1]]
您是否尝试过:

[x for y in range(3) for x in range(y)]
因为这会产生一个输出。。。这将产生:

[0, 0, 1]

这可能是你想要的,也可能不是你想要的……

记住顺序的一个好方法是思考你如何在没有列表理解的情况下做到这一点(最近有人提到了这一点,它卡住了),但列表不是我需要的。无论如何谢谢你。@Alfe你的问题不是很清楚。那么就用马蒂恩的答案吧。:)谢谢我想这让我大开眼界了:-)不过,我觉得有点奇怪,这种顺序是可以预期的。我总是认为列表理解是使用生成器来描述列表。这种观点是错误的还是危险的?我把“发电机”这个词改成了“理解力”。@阿尔夫:有一点。您不能从无止境的生成器(如
itertools.count()
)创建列表,但您可以从这样的生成器表达式中有效地绘制项目,只要您不希望它在某个时候完成。+1感谢Martijn,我直到现在才理解顺序。(可能与“除非你是荷兰人否则不明显”有关。)这正是我想要的,是的。当然,我的用例有点复杂:返回[target中target的值,self.db[target].keys()中的值,如果topic==chosenTopic]@Levon,有时会同时发布答案。一旦我点击submit,我发现其他人比我强。然后,我决定添加运行此命令的输出,因为其他命令没有包含此命令(但-我还没有检查)。实际上,它只是变成了这样:
list(set(targetSet for topic中的target的值,self.db[target]中的值)。iteritems()if topic==chosenTopic for value in value if(topic,value)not in trail))
。我不知道是否有人能猜出我现在在做什么;-)还有一件事:
set([topic for target in target for topic,value in self.db[target].iteritems()如果set((topic,value)for value in values)-trail])
。但现在我偏离了主题,对不起。