2016-10-25 197 views
0

我想元素添加到空列表,我的代碼如下所示:的Python - 追加元素嵌套列表

A = [1,2,3,4] 
B = [["a 1","a 2","g 8"],["a 3"],[],["a 5"]] 
C = ["a", "g"] 

D = [[] for _ in range(len(C))] 
D = [D for _ in range(len(A))] 

for i in range(len(A)): 
    for j in range(len(B[i])): 
     for k in range(len(C)): 
      if B[i][j].split(" ")[0] == C[0]: 
       D[i][1].append(B[i][j].split(" ")[1]) 

輸出是:

[[['1', '2', '3', '5'], ['1', '2', '3', '5']], 
[['1', '2', '3', '5'], ['1', '2', '3', '5']], 
[['1', '2', '3', '5'], ['1', '2', '3', '5']], 
[['1', '2', '3', '5'], ['1', '2', '3', '5']]] 

輸出我想:

[[['1','2'], ['8']], 
[['3'], []], 
[[], []], 
[['5'], []]] 

當我嘗試手動添加列表時(D[0][0].append(1)) ...每個子列表都以相同的方式添加後)會發生同樣的情況。

我在A中有座標,在座標B中有不同的對象(例如a 1g 23,它們都以字母和數字命名。 C是一個包含字母的列表。可以說我有2個不同的字母(a and g)。我想得到的是列表的列表,告訴我每個字母,哪些數字是在特定的座標。 會發生什麼,append-command會在正確的位置添加數字,但對於每個我...因此我得到相同列表的列表。

你知道我在做什麼錯嗎?

回答

0

對於初學者:

D =  [D for _ in range(len(A))] 

D是對同一列表的四個引用的列表。這可能不是你想要的,會導致很多混亂。

只要做到一步到位的初始化:既然你不使用的值

D = [[ [] for _ in C] for _ in A] 

range(len(...))提法是不必要的。迭代四個項目的列表將迭代四次,與迭代列表的長度範圍相同。

+0

THX大家。它工作正常...我有這麼多與python學習... – derh

0

D = [D for _ in range(len(A))]創建一個列表裏面有一堆相同列表的副本。你對其中一個人做的任何事情都會對所有其他人做,因爲他們是同一個名單。

它看起來像你想要的是:

D = [ [[] for ix in range(len(C))] for jx in range(len(A)) ] 

就像你在內部理解所做的,你每次都需要重新在外理解一個新的列表。

(你實際上並不需要的東西range(len(...)),如kindall在他的回答中提到,但我要離開,在以避免陷入其他問題。)

0

這是您的原始代碼,添加它使其工作。該解決方案讓你的結構不變櫃面你需要A,B,C和D

A = [1,2,3,4] 
B = [["a 1","a 2","g 8"],["a 3"],[],["a 5"]] 
C = ["a", "g"] 

D = [] 

for i in range(len(A)): 
    E = [] 
    for k in range(len(C)): 
     F = [] 
     for j in range(len(B[i])): 
      if B[i][j].split(" ")[0] == C[k]: 
       F.append(B[i][j].split(" ")[1]) 

     E.append(F) 
    D.append(E) 

for x in D : 
    print x 

輸出是

[['1', '2'], ['8']] 
[['3'], []] 
[[], []] 
[['5'], []]