[英]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[:]*10
與myList = [[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.