如何将列表添加到字典中的列表中

时间:2016-06-27 07:47:57

标签: python list dictionary while-loop append

我正在努力弄清楚这里出了什么问题我试图将这个列表附加到字典键的列表中,但我只得到最后一个。

例如:

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)    

我的标准写着:

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

我希望pos的每个版本都附加到turnpt['pos']列表中,但这不会发生,为什么会这样?

注意:

我的if逻辑是嵌套的,因为我需要在每个之间完成其他操作,这只是一个有效的例子。

2 个答案:

答案 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'])

答案 1 :(得分:0)

你的问题在

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

你检查pos是否不在[' pos']中,然后你追加它,所以在那之后pos不是[' 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))