2016-10-25 8 views
0

ich möchte Elemente in eine leere Liste hinzuzufügen, sieht mein Code wie folgt aus:Python - Anfügen Elemente verschachtelte Liste

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]) 

Ausgang ist:

[[['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']]] 

Ausgang Ich möchte:

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

Gleiches geschieht, wenn ich versuche, die Liste manuell anzufügen (D[0][0].append(1)) ... jede Unterliste wird auf die gleiche Weise angefügt.

Ich habe Koordinaten in A, verschiedene Objekte an diesen Koordinaten in B (zum Beispiel a 1 und g 23 die alle mit einem Buchstaben und einer Nummer benannt sind. C ist eine Liste, die die Buchstaben enthält. Sagen wir, ich habe 2 verschiedene Buchstaben (a and g). Was ich bekommen will, ist eine Liste von Listen, die mir für jeden Buchstaben sagt, welche Zahlen an bestimmten Koordinaten sind. Was passiert, ist, dass der append-Befehl die Nummer an der richtigen Stelle hinzufügt, aber für jedes i ... also bekomme ich eine Liste mit identischen Listen.

Haben Sie eine Idee, was ich falsch mache?

Antwort

0

Für den Anfang:

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

ist eine Liste von vier Referenzen auf die gleiche Liste. Dies ist wahrscheinlich nicht das, was Sie wollen und wird viel Verwirrung verursachen.

tun einfach die Initialisierung in einem Schritt:

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

Die range(len(...)) Formulierung nicht notwendig ist, da Sie nicht mit den Werten. Das Iterieren über eine Liste mit vier Elementen wird viermal wiederholt, genauso wie das Iterieren über einen Bereich der Länge der Liste.

+0

Thx Sie alle. Es funktioniert gut ... ich habe so viel mit Python zu lernen ... – derh

0

D = [D for _ in range(len(A))] erstellt eine Liste mit einer Reihe von Kopien der gleichen Liste innerhalb. Alles, was Sie mit einem von ihnen tun, wird auch für alle anderen getan, da es sich um dieselbe Liste handelt.

Es sieht aus wie das, was Sie wollen, ist:

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

So wie Sie in dem inneren Verständnis haben, müssen Sie jedes Mal eine neue Liste in dem äußeren Verständnis regenerieren.

(Sie nicht wirklich brauchen die range(len(...)) Sachen, wie Kindall in seiner Antwort erwähnt, aber ich verlasse, dass immer in andere Probleme zu vermeiden.)

0

Dies ist Ihr ursprünglicher Code mit Ergänzungen, damit es funktioniert. Diese Lösung lässt Ihre Struktur intakt einhüllen Sie A, B, C benötigt, und 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 

Der Ausgang ist

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