2016-06-27 8 views
0

私はこのリストを辞書のキーのリストに追加しようとしていますが、最後のものだけを取得しようとしています。辞書のリストにリストを追加するにはどうすればいいですか

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)  

私のstdoutが読み取ります:たとえば

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

私はturnpt['pos']リストに追加するposの各バージョンを期待していますが、それは起こりませんが、理由がありますこの?

注:私は一つ一つの間に完了する必要がある他のアクションがあるので、ロジックがネストされている場合

私は、これは単なる実施例です。

+0

あなたのインデントは、読みやすさの目的のために –

答えて

1

posのコピーをpos[:]で渡します。 posを追加して変更すると、turnptに変更されます。これはリストへの参照であり、条件は決してTrueにならないためです。

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

正しくないですが、私は 'POSを使用することを好む[:]私はリスト'のような(POS)に何かを読んだとき、 '私は' pos'を期待しているので、 'リストをコピーしますあるものにするリスト以外のもの、例えば。ジェネレータ。もっと一般的なのは何か? –

+0

すごくうまくいった!なぜこれが当てはまるのか説明できますか? –

+0

@ juanpa.arrivillaga私はこれらの両方が幅広く使用されていると思いますが、私はあなたに同意します。 'pos [:]'は読みやすくするために良いです。 –

0

あなたの問題はturnpt [ 'POS']でないでposは、その後、あなたがそのPOS後にそうではないturnpt [ 'POS']で、それを追加する場合は、チェック

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

にされています決して真実ではない。

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 

を使用すると、POSのコピーを追加する場合は、あなたが予想される動作があります:

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

かを、posはその後決して変更された場合、それはタプルを使うようにするとよいでしょう説明する例代わりに

turnpt['pos'].append(tuple(pos)) 
関連する問題