更多pythonic方式的重复嵌套列表理解

时间:2017-10-11 16:45:33

标签: python multidimensional-array nested list-comprehension

我想在Python中创建一个空的NxNxN列表。 我现在的方式如下:

cells = [[[[] for _ in range(N)]
              for _ in range(N)]
              for _ in range(N)]

必须有一个更好的方法来写这个,在范围(N)"中重复" for _部分有点可怕。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:2)

为避免手动为每个维度编写理解,这里是递归方法:

<强>代码

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()是典型的recursive function,其中基本情况返回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)))))