簡體   English   中英

如何創建多維列表

[英]How to create a multi-dimensional list

我想初始化一個多維列表。 基本上,我想要一個 10x10 的網格 - 一個包含 10 個列表的列表,每個列表包含 10 個項目。

每個列表值都應初始化為整數 0。

在單行中執行此操作的明顯方法: myList = [[0]*10]*10將不起作用,因為它會生成一個包含 10 個對一個列表的引用的列表,因此更改任何行中的一項都會改變它行。

我看過的文檔談到使用[:]復制列表,但是在使用乘數時仍然不起作用: myList = [0]*10; myList = myList[:]*10 myList = [0]*10; myList = myList[:]*10myList = [[0]*10]*10具有相同的效果。

myList.append()創建myList.append()的循環myList.append() ,是否有一種快速有效的方法來以這種方式初始化列表?

您可以使用列表理解非常有效地做到這一點:

a = [[0] * number_cols for i in range(number_rows)]

這是...嵌套列表理解的工作

[[0 for i in range(10)] for j in range(10)]

只是想我會添加一個答案,因為這個問題要求一般的 n 維情況,我認為還沒有回答。 您可以使用以下示例對任意數量的維度遞歸執行此操作:

n_dims = [3, 4, 5]

empty_list = 0
for n in n_dims:
    empty_list = [empty_list] * n

>>>empty_list
>>>[[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]

您實際上可能需要一個數組而不是一些列表。 幾乎每次我看到這種“預先設定的嵌套列表”模式時,都有些不對勁。

另一個解決方案是使用 NumPy 庫:

import numpy as np

zero_array = np.zeros((10, 10), dtype='int')

如有必要,可以使用.tolist()方法輕松將其轉換為常規 python 列表。

我發現要得到你的意思你需要你

import copy

def n_dim_list(dims, init_val):
    if not dims:
        return []
    lst = [init_val for i in range(dims[-1])]
    for d in dims[::-1][1::]:
        lst = [copy.deepcopy(lst) for i in range(d)]
return lst

其中 dims 是您想要的維度數量的長度列表,內容是每個維度中所需的 nd-list 的大小。 不是最優雅但清晰並且可以完成工作。

另一種方法,但使用OP的拒絕方法。

import numpy as np
myList = [[0]*10]*10
myList = np.array(myList)
l=myList.tolist()
myList=l

輸出和測試如下:

>>> l
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> l[0][0]=100
>>> l
[[100, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

輸出與l[0]的預期克隆不同。

雖然這不是時間效率。 一個 1000X1000 的列表需要將近 7 秒,而列表理解只需要 0.0052158 秒。

這是一個使用遞歸列表推導式適用於任意維數的函數。 它不需要任何導入即可工作。

def init_list(dims, val):
    if len(dims) == 0:
        raise ValueError("Requires at least 1 dimension.")

    if len(dims) == 1:
        return [val for _ in range(dims[0])]

    return [init_list(dims[1:], val=val) for _ in range(dims[0])]

例子:

>>> init_list([3, 2, 1], val=0)
[[[0], [0]], [[0], [0]], [[0], [0]]]

執行此操作的兩種常見且簡短的方法:

第一的:

[[0] * n] * m

第二:

[[0 for column in range(n)] for row in range(m)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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