用于在 python 中创建列表的单行非嵌套 for 循环
Posted
技术标签:
【中文标题】用于在 python 中创建列表的单行非嵌套 for 循环【英文标题】:Non nested for loops in a single line for creating list in python 【发布时间】:2015-05-17 13:30:45 【问题描述】:我是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 被视为 for 循环的迭代器以及 [0, 1]。我在 C 和 python 中错误地关联逗号。我如何实现我打算做的事情(单行)? (我知道我可以直接做,因为它的范围很小。但是如果有更大的呢?)
【问题讨论】:
订单是故意随机的吗?我最初以为你打算执行[ [y,z] for y in range(-1, 2) for z in range(-1, 2)]
。请更好地解释自己。
列表推导式生成同质列表。您正在尝试创建一个异构列表,其中包含整数列表(例如[-1, -1]
)和整数列表列表([[1,1], [1,0], [1, -1]]
)。
【参考方案1】:
你应该连接列表,并将嵌套列表放在括号中
>>> [[-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]]
【讨论】:
【参考方案2】:查看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:
在那之前我做过:
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]
【讨论】:
以上是关于用于在 python 中创建列表的单行非嵌套 for 循环的主要内容,如果未能解决你的问题,请参考以下文章