簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM