用于在 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。从您的问题中不确定您是想要productpermutations 还是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 循环的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建嵌套列表的最佳方法是啥?

如何在 python 的多处理中创建嵌套共享对象?

在字典中创建嵌套列表,列表中没有重复项

如何在 reStructuredText 中创建嵌套列表?

从字典列表中创建嵌套的 json 对象

如何编写 python 单行代码来创建文件中所有单词的列表? [复制]