2016-07-01 108 views
1

如果我想創建一個像list = [[[],[]],[[],[]]]這樣的3層嵌套列表,那麼執行此操作的適當方法是什麼?我看到其他人發佈的解決方案爲2層嵌套列表lst = [[] for _ in xrange(a)]。有沒有更普遍的方式來創建這個嵌套的列表,而不建立在第三層中有多少個列表?創建空的3層嵌套列表

另外,有沒有辦法在第三層創建不等數量的列表?例如:list = [[[],[]],[]],其中len(list[0])=2len(list[1])=0

+1

你的第一個例子正常工作 – Fredrik

+1

是'名單= [[ [],[]],[[],[]]]'不適合你? –

+0

這是一個例子。我想要一個更普遍的方式來創建一個嵌套列表,而不必在第三層中建立多少個列表。 – A1122

回答

0

如果您事先知道第三層列表的長度,有一種方法。

>>> length = [1,2,3,4] # indicates the lengths of the third layer lists 
>>> res = [ [ [] for i in range(j) ] for j in length ] 
>>> res 
[[[]], [[], []], [[], [], []], [[], [], [], []]] 
+0

你不需要使用循環,使用普通的「*」運算符,應該避免使用「xrange」,因爲它是在python3中折舊的 – Jerzyk

+0

應該避免使用'*'運算符。看到我對丹尼爾答案的評論。 'xrange'轉換爲'範圍'。謝謝。 – Rahul

3

你可以使用Python的算術運算符來生成您的嵌套列表(此方法比使用嵌套for循環迭代更好的性能):

def listmaker(n, m): 
    # n = number of lists in the 3rd layer 
    # m = number of lists in the 2nd layer 
    return [[[]] * n] * m 

listmaker(2, 2) 
# [[[],[]],[[],[]]] 

# you could use the "+" operator to create unequal numbers of lists in the 3rd layer 
listmaker(2, 2) + listmaker(1, 1) 
# [[[], []], [[], []], [[]]] 
+0

這當然是一個非常錯誤的方式(至少在Python 2.7中)。如果我做'l = [[[]] * 2] * 2',然後'l [0] [0] .append(1)',那麼'l'變成'[[[1],[1] ],[[1],[1]]]',這顯然不應該發生。 – Rahul

+0

其實,你描述的行爲在Python中是正確的。在這種情況下使用'*'等運算符會創建對[]'對象的引用,這意味着當您更改一個這樣的對象時(就像使用append()一樣),將所有對該對象的引用。有很多SO問題處理這個概念,例如:http://stackoverflow.com/questions/240178/。我的回答仍然比嵌套的'for'循環更有效果,因爲OP似乎想要做什麼,而不會留下長長的兔子洞:OP的可能意圖。 – Daniel

+0

此外,還有許多其他可能的答案(使用'map',Numpy等)。這完全取決於OP想要做什麼。 – Daniel