如果我想創建一個像list = [[[],[]],[[],[]]]
這樣的3層嵌套列表,那麼執行此操作的適當方法是什麼?我看到其他人發佈的解決方案爲2層嵌套列表lst = [[] for _ in xrange(a)]
。有沒有更普遍的方式來創建這個嵌套的列表,而不建立在第三層中有多少個列表?創建空的3層嵌套列表
另外,有沒有辦法在第三層創建不等數量的列表?例如:list = [[[],[]],[]]
,其中len(list[0])=2
和len(list[1])=0
如果我想創建一個像list = [[[],[]],[[],[]]]
這樣的3層嵌套列表,那麼執行此操作的適當方法是什麼?我看到其他人發佈的解決方案爲2層嵌套列表lst = [[] for _ in xrange(a)]
。有沒有更普遍的方式來創建這個嵌套的列表,而不建立在第三層中有多少個列表?創建空的3層嵌套列表
另外,有沒有辦法在第三層創建不等數量的列表?例如:list = [[[],[]],[]]
,其中len(list[0])=2
和len(list[1])=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
[[[]], [[], []], [[], [], []], [[], [], [], []]]
你可以使用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)
# [[[], []], [[], []], [[]]]
這當然是一個非常錯誤的方式(至少在Python 2.7中)。如果我做'l = [[[]] * 2] * 2',然後'l [0] [0] .append(1)',那麼'l'變成'[[[1],[1] ],[[1],[1]]]',這顯然不應該發生。 – Rahul
其實,你描述的行爲在Python中是正確的。在這種情況下使用'*'等運算符會創建對[]'對象的引用,這意味着當您更改一個這樣的對象時(就像使用append()一樣),將所有對該對象的引用。有很多SO問題處理這個概念,例如:http://stackoverflow.com/questions/240178/。我的回答仍然比嵌套的'for'循環更有效果,因爲OP似乎想要做什麼,而不會留下長長的兔子洞:OP的可能意圖。 – Daniel
此外,還有許多其他可能的答案(使用'map',Numpy等)。這完全取決於OP想要做什麼。 – Daniel
你的第一個例子正常工作 – Fredrik
是'名單= [[ [],[]],[[],[]]]'不適合你? –
這是一個例子。我想要一個更普遍的方式來創建一個嵌套列表,而不必在第三層中建立多少個列表。 – A1122