非嵌套for循环在一行中用于在python中创建列表

时间:2015-05-17 13:30:46

标签: python list comma

我是python的新手。我想在一行中创建一个列表:

>>> x = [[-1, y] for y in range(-1, 2), [0, 1], [1, z] for z in range(1, -2, -1), [0, -1]]

得到:

>>>> x = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]]

但它给出了错误:name' z'没有定义。因此,我必须在单独的行上使用for循环和单对进行,每次都附加。在此之前我做了:

>>> x = [[-1, y] for y in range(-1, 2),[0, 1]]
>>> x
[[-1, [-1, 0, 1]], [-1, [0, 1]]]

告诉我y被视为for循环的迭代器以及[0,1]。我在C和python中错误地编写了逗号。我如何实现我打算做的事情(单行)? (我知道我可以直接做到这一点,因为它的范围很小。但如果有更大的那个怎么办?)

2 个答案:

答案 0 :(得分:2)

您应该连接列表,并将嵌套列表放到括号

>>> [[-1, y] for y in range(-1, 2)] + [[0, 1], [[1, z] for z in range(1, -2, -1)], [0, -1]]
[[-1, -1], [-1, 0], [-1, 1], [0, 1], [[1, 1], [1, 0], [1, -1]], [0, -1]]

答案 1 :(得分:0)

结帐itertools。您不确定自己是否想要productpermutationscombinations,但我认为其中一个将是您需要的。

编辑:仔细观察后,你做了一些更简单的事情,你错过了几个括号。尝试:

x = [[[-1, y] for y in range(-1, 2)], [0, 1], [[1, z] for z in range(1, -2, -1)], [0, -1]]

列表推导在它们自己的括号中,它与列表文字的语法相似但不相同。

编辑2:

  

在此之前我做了:

x = [[-1, y] for y in range(-1, 2),[0, 1]]
x [[-1, [-1, 0, 1]], [-1, [0, 1]]]
     

告诉我y被视为for循环的迭代器以及[0,1]。一世   我在C和python中错误地编写了逗号。我如何实现我的目标   打算做(单行)? (我知道我可以直接做到   因为它的范围很小。但如果有更大的那个怎么办?)

是的,你误解了你的逗号在那里做了什么。它将你的for循环的第二部分变成(range(-1,2), [0, 1])的元组(2项)。你需要做的是在range(-1,2)之后关闭你的列表理解,然后将整个事物用方括号括起来使它成为文字列表声明:

x = [[[-1, y] for y in range(-1, 2)],[0, 1]]

正如@YuriyKovalev所提到的,将列表连接起来可能会更清楚:

x = [[-1, y] for y in range(-1, 2)] + [0, 1]