[英]More pythonic way of repetitive nested list comprehension
我想在Python中创建一个空的NxNxN列表。 我现在这样做的方式如下:
cells = [[[[] for _ in range(N)]
for _ in range(N)]
for _ in range(N)]
必须有一个更好的方法来写这个,重复“for _ in range(N)”部分有点可怕。
关于如何做到这一点的任何想法?
为避免手动编写每个维度的理解,这里是一个递归方法:
码
import copy
import itertools as it
def empty(item, n, dim=3):
"""Return a matrix of `n` repeated `item`s."""
copier = lambda x: [copy.deepcopy(x) for _ in it.repeat(None, n)]
if not dim:
return item
return empty(copier(item), n, dim-1)
演示
>>> cells = empty([], 3)
>>> cells
[[[[], [], []], [[], [], []], [[], [], []]],
[[[], [], []], [[], [], []], [[], [], []]],
[[[], [], []], [[], [], []], [[], [], []]]]
嵌套项是单独的对象:
>>> cells[2][2][1] = "hi"
>>> cells
[[[[], [], []], [[], [], []], [[], [], []]],
[[[], [], []], [[], [], []], [[], [], []]],
[[[], [], []], [[], [], []], [[], 'hi', []]]]
元素可以是任何对象:
>>> empty("", 2)
[[['', ''], ['', '']],
[['', ''], ['', '']]]
控制最终尺寸( dim
),例如N x N, dim=2
:
>>> empty("", 2, dim=2)
[['', ''], ['', '']]
细节
empty()
是一个典型的递归函数 ,其中基本案例返回一个item
,并且递归调用是在copier()
函数上进行的。
# Equivalent
def copier(x):
return [copy.deepcopy(x) for _ in range(n)]
后者类似于OP的示例,但复制每个项目以返回唯一对象。 如果项目是嵌套容器,则对每个元素应用deepcopy
。 如果唯一元素不重要,您可以考虑dim=3
的以下实现:
def empty(item, n):
"""Return an (n x n x n) empty matrix."""
f = ft.partial(it.repeat, times=n)
return list(map(list, map(f, map(list, map(f, [item]*n)))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.