0

我刚遇到一个让我很困惑的问题。我的意思是生成一个列表,出于某种原因,我做了类似的事情:

mylist = [i for i in range(5), j for j in range(5)]

然后解释器向我抱怨说,在 'for' 之前的位置 'j' 处的语法无效。所以我在列表之前定义了 j 。谁能解释一下为什么我不需要定义 'i' 而是 'j' ?

我希望得到类似的东西:

[[0,1,2,3,4],[0,1,2,3,4]]

但是,我得到了(我提前将 2 分配给 j)

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], 2, 2, 2, 2, 2]

我真的很困惑,谁能告诉我为什么会得到这个结果?

提前非常感谢。

4

3 回答 3

6

你要做的是创建两个嵌套列表,所以嵌套你的理解:

[[i for i in range(5)], [j for j in range(5)]]

或者,因为您没有对表达式做任何事情,所以:

[list(range(5)), list(range(5))]

在 Python 2 中,即使是list()调用也是多余的。

您没有分享您的“j在列表理解代码之外定义”的样子,但确实意识到列表理解支持嵌套 for 循环

列表推导式可以看作是一系列 for 循环和if语句,从左到右阅读被视为嵌套语句:

[i for i in range(5) for j in range(5)]

应该读作:

for i in range(5):
    for j in range(5):
        outputlist.append(i)

从你的输出来看,你做了这样的事情:

[j for i in range(5)]

在 Python 2 上j设置为where 。range(5)

于 2013-07-15T08:25:21.763 回答
1

你想在一个列表中创建两个列表,所以:

list_ = [list(range(5)), list(range(5))]
print(list_) # [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

覆盖'list' buildin 不是一个好主意,因此最好在list名称中添加下划线或使用其他名称。

于 2013-07-15T08:26:21.543 回答
0

要创建您想要的内容,您可以执行以下操作:

>>> [range(5)]*2
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

或者,如果您需要列表是@Blckknght 指出的单独对象:

>>> [range(5), range(5)]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
于 2013-08-05T15:10:42.307 回答