2016-06-27 7 views
0

Ich habe Schwierigkeiten herauszufinden, was hier schief geht. Ich versuche, diese Liste an die Liste eines Wörterbuchschlüssels anzufügen, aber ich bekomme immer nur die letzte.Wie kann ich eine Liste zu einer Liste in einem Wörterbuch hinzufügen

Zum Beispiel:

pastmoves =['n','w','s','w'] 
moves = [1,0,1,0] 
turnpt = {'pos' : [], 
      'moves' : [], 
      'lastmove' : []} 
pos = [1,1] 
opt = [1] 


while 5 not in opt: 
    if len(pastmoves) > 1: 
     if moves.count(1) > 1: 
      if pos not in turnpt['pos']: 
       turnpt['pos'].append(pos) 
       print(turnpt['pos']) 
    pos[1] += 1 
    print(pos) 
    opt[0] += 1 
else: 
    print(opt)  

Meine stdout lautet:

[[1, 1]] 
[1, 2] 
[1, 3] 
[1, 4] 
[1, 5] 
[5] 

ich jede Version von pos erwartet auf die turnpt['pos'] Liste angehängt werden, aber das geschieht nicht, warum Dies?

Hinweis:

Meine Logik, wenn verschachtelt ist, weil es andere Aktionen sind ich brauche zwischen jedem abzuschließen in, das ist nur ein funktionierendes Beispiel.

+0

Ihre Einbuchtung nicht korrekt –

Antwort

1

Eine Kopie der Liste pos mit pos[:] übergeben. Wenn Sie pos anhängen und dann ändern, wird es auch in turnpt geändert, da es sich um eine Referenz auf eine Liste handelt und Ihre Bedingung niemals True lautet.

while 5 not in opt: 
    if len(pastmoves) > 1: 
     if moves.count(1) > 1: 
      if pos not in turnpt['pos']: 
       turnpt['pos'].append(pos[:]) 
       print(turnpt['pos']) 
+0

Für die Zwecke der Lesbarkeit ist, ziehe ich 'po verwenden [:]', um eine Liste zu kopieren, weil, wenn ich so etwas wie 'Liste (pos) lesen' ich erwarte, dass 'pos' um etwas zu sein etwas anderes als eine Liste, z.B. ein Generator. Ich frage mich, was ist häufiger? –

+0

Großartig, das hat perfekt funktioniert! Könnten Sie bitte erklären, warum das so ist? –

+0

@ juanpa.arrivillaga Ich denke, dass beide weit verbreitet sind, aber ich stimme dir zu, 'pos [:]' ist besser für die Lesbarkeit. –

0

Ihr Problem ist in

if pos not in turnpt['pos']: 
    turnpt['pos'].append(pos) 

Sie überprüfen, ob po nicht in turnpt [ 'po'], dann hängen Sie Sie es, so nach, dass pos nicht in turnpt [ 'po'] ist niemals wahr. Beispiel zur Veranschaulichung:

a = [1,1] 
b = [[1,1]] 
c = [a] 

a in b == True 
a in c == True 

a[0] = 2 

a in b = False 
a in c == True 

Wenn Sie eine Kopie der pos anhängen, können Sie das erwartete Verhalten haben:

turnpt['pos'].append(pos[:]) 

Oder, wenn pos ändert sich nie danach, es ist eine gute Praxis, ein Tupel zu verwenden statt

turnpt['pos'].append(tuple(pos))