Python:更新二维字典数组

2024-09-27 07:17:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个q学习项目,这个项目涉及到一个解决迷宫的圆圈,这是我如何更新q值的问题,但我不确定在哪里:我已经花了3天的时间在这个问题上,我已经束手无策了。在

仔细观察,Q的每一行中的每一组字典似乎都是相同的(例如:的值)[方向。向上]第3行是总是22,即使不是这样)

欢迎使用任何指针,这里是有问题的代码,希望您可以自己测试:

rows=cols=10
for i in range(rows):
    Q.append([{}]*(cols))
    for x in range (cols):
        for y in range (rows):
            Q[x][y][Direction.up]=0
            Q[x][y][Direction.down]=0
            Q[x][y][Direction.left]=0
            Q[x][y][Direction.right]=0
x=5
y=2
Q[x][y][Direction.right]=22
for x in range (cols):
    for y in range (rows):
        print(x," ",y)
        print(Q[x][y])
        print("\n")
    print("\n")

Tags: 项目inrightfor字典时间range方向
2条回答

一个主要问题是数据结构。我想你想在每个x,y和方向上存储一个值。 但是如果你用乘法初始化字典列表

Q = [{}] * 10

最后得到的列表是同一本字典的十倍,而不是十个不同的:

^{pr2}$

所以要么在循环中初始化字典

^{3}$

或者只使用一个以元组(x, y, direction)作为键的字典:

Q = {}
for x in range(rows):
    for y in range(cols):
        for dir in Direction:
            Q[(x, y, dir)] = 0

所以实际的问题是您正在创建一个字典cols重复的列表{}。在

a = [{}]*3
b = [{} for _ in range(3)]
print(id(a[0]), id(a[1]), id(a[2])) # returns 3 times the same identity
print(id(b[0]), id(b[1]), id(b[2])) # returns 3 different identities

问题是乘法运算符*被定义来处理对象。因此,首先计算表达式,然后乘以对象。在理解中,表达式在每次迭代时都要求值。在

*运算符不知道对象内部有一个表达式和/或要复制它的任何部分。因此,它生成对同一对象的引用,而不是创建新对象。 乘法运算符的这种行为是语言设计的一个基本部分,因此,我们这些Python用户必须适应使用它。在

顺便说一下,rowscols定义也是如此。在

^{pr2}$

但是,由于整数是不可变的,因此如果重新定义rows,就不会改变cols

^{3}$

但是,如果您使用可变对象,那么您将得到与当前字典列表中类似的行为问题:

rows = cols = {}
rows.update({1: 'a'})
print(rows, cols) #{1: 'a'} {1: 'a'}

现在,这让我们在寻求让您的字典按照您希望的方式更新的过程中有何进展(我随意修改了一些我认为多余的代码部分):

rows=cols=10
for i in range(rows):
    Q.append([{} for _ in range(cols)])
    for x in range(cols):
        Q[x][i][Direction.up]=0
        Q[x][i][Direction.down]=0
        Q[x][i][Direction.left]=0
        Q[x][i][Direction.right]=0
x=5
y=2
Q[x][y][Direction.right]=22
for x in range(cols):
    for y in range(rows):
        print(x, '  ', y, '\n', Q[x][y], '\n', sep='')
    print("\n")

相关问题 更多 >

    热门问题