单行中的非嵌套 for 循环用于在 python 中创建列表
Non nested for loops in a single line for creating list in python
我是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]]
但出现错误:未定义名称 'z'。所以我不得不在不同的行上使用 for 循环和单对,每次都追加。在那之前我做了:
>>> x = [[-1, y] for y in range(-1, 2),[0, 1]]
>>> x
[[-1, [-1, 0, 1]], [-1, [0, 1]]]
这告诉我 y 和 [0, 1] 一样被当作 for 循环的迭代器。我在 C 和 python 中错误地关联了逗号。我如何实现我打算做的事情(在一行中)? (我知道我可以直接做,因为它的范围很小。但是如果有更大的呢?)
您应该连接列表,并将嵌套列表放在方括号中
>>> [[-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]]
查看 itertools。从你的问题中不确定你是否想要 product
、permutations
或 combinations
,但我认为其中之一将是你需要的。
编辑:仔细检查后,您做的事情要简单得多,只是漏掉了几个括号。尝试:
x = [[[-1, y] for y in range(-1, 2)], [0, 1], [[1, z] for z in range(1, -2, -1)], [0, -1]]
列表推导在它们自己的一组括号中,它类似于列表文字的语法但不相同。
编辑 2:
Before that I did :
x = [[-1, y] for y in range(-1, 2),[0, 1]]
x [[-1, [-1, 0, 1]], [-1, [0, 1]]]
which tells me y is taken as iterator of for loop as well as [0, 1]. I
am wrongly corelating comma in C and python. How do I achieve what I
intend to do (in a single line) ? (I know that I could do it directly
since its a small range. But what if there was a bigger one?)
是的,您误解了逗号在那里的作用。它将 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]
我是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]]
但出现错误:未定义名称 'z'。所以我不得不在不同的行上使用 for 循环和单对,每次都追加。在那之前我做了:
>>> x = [[-1, y] for y in range(-1, 2),[0, 1]]
>>> x
[[-1, [-1, 0, 1]], [-1, [0, 1]]]
这告诉我 y 和 [0, 1] 一样被当作 for 循环的迭代器。我在 C 和 python 中错误地关联了逗号。我如何实现我打算做的事情(在一行中)? (我知道我可以直接做,因为它的范围很小。但是如果有更大的呢?)
您应该连接列表,并将嵌套列表放在方括号中
>>> [[-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]]
查看 itertools。从你的问题中不确定你是否想要 product
、permutations
或 combinations
,但我认为其中之一将是你需要的。
编辑:仔细检查后,您做的事情要简单得多,只是漏掉了几个括号。尝试:
x = [[[-1, y] for y in range(-1, 2)], [0, 1], [[1, z] for z in range(1, -2, -1)], [0, -1]]
列表推导在它们自己的一组括号中,它类似于列表文字的语法但不相同。
编辑 2:
Before that I did :
x = [[-1, y] for y in range(-1, 2),[0, 1]] x [[-1, [-1, 0, 1]], [-1, [0, 1]]]
which tells me y is taken as iterator of for loop as well as [0, 1]. I am wrongly corelating comma in C and python. How do I achieve what I intend to do (in a single line) ? (I know that I could do it directly since its a small range. But what if there was a bigger one?)
是的,您误解了逗号在那里的作用。它将 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]