首页 > 解决方案 > Python 字典没有像我预期的那样打印

问题描述

我一直在研究一个 python 脚本,给定一个由三个列表组成的列表,它将创建一个字典,该字典将存储键值对,其中键将列表的(行、列)表示为元组,以及相应的values 是该特定位置的列表值。这是我所拥有的:

EMPTY = None

board_2 = [
    [EMPTY, EMPTY, EMPTY],
    [EMPTY, EMPTY, EMPTY],
    [EMPTY, EMPTY, EMPTY]
    ]

board_position = {}
for row in board_2:
    for cell in row:
        board_position[(board_2.index(row), row.index(cell))] = board_2[board_2.index(row)][row.index(cell)]

print(board_position)

我希望它会打印出一个字典,其中所有九个键都将None作为它们的值;然而,相反,我只是得到这个作为回报:

{(0, 0): None}

似乎字典在给出第一个键值对后停止了,然后忽略了所有内容。我认为我的代码有问题,比如我的逻辑可能在嵌套循环中关闭。然而令人难以置信的是,当我决定创建另一个版本的 时board_2,这一次board_1board_1列表中有不同的值,我的代码似乎可以工作:

输入:

board_1 = [
   ['00', '01', '02'],
   ['10', '11', '12'],
   ['20', '21', '22']
   ]

board_position = {}
for row in board_1:
    for cell in row:
        board_position[(board_1.index(row), row.index(cell))] = board_1[board_1.index(row)][row.index(cell)]

print(board_position)

输出:

{(0, 0): '00', (0, 1): '01', (0, 2): '02', (1, 0): '10', (1, 1): '11', (1, 2): '12', (2, 0): '20', (2, 1): '21', (2, 2): '22'}
{'a': 1, 'b': 1}

现在,这似乎奏效了。我可以看到两个板版本之间的唯一区别是列表中的值不同;但我不明白为什么这很重要。我知道,如果将预先存在的键附加到字典中,则字典将使用新值更新现有键。但看起来钥匙不同了;值,虽然是相同的。我在这里遗漏了什么,我的代码是错误的,还是我现在应该对 python 字典做些什么?任何帮助,将不胜感激。

标签: python-3.xdictionarynested-loops

解决方案


索引返回列表中第一次出现的值 - 因此您的所有值EMPTY都在位置 0 处找到。并添加为(0,0). 您一遍又一遍地覆盖相同的键 - 所以您的结果字典中只有这个键。

您的第二个示例具有所有不同的值,因此index可以正常工作-但是获取所有这些索引非常耗时。

最好使用enumerate代替:

EMPTY = None

board_2 = [
    [EMPTY, EMPTY, EMPTY],
    [EMPTY, EMPTY, EMPTY],
    [EMPTY, EMPTY, EMPTY]
    ]

board_1 = [
   ['00', '01', '02'],
   ['10', '11', '12'],
   ['20', '21', '22']
   ]

for b in (board_2, board_1):
    board_position = {}
    for id1, row in enumerate(b):
        for id2,cell in enumerate(row):
            board_position[(id1,id2)] = cell

    print(board_position)

输出:

{(0, 1): None, (1, 2): None, (0, 0): None, (2, 1): None, (1, 1): None, 
 (2, 0): None, (2, 2): None, (1, 0): None, (0, 2): None}

{(0, 1): '01', (1, 2): '12', (0, 0): '00', (2, 1): '21', (1, 1): '11', 
 (2, 0): '20', (2, 2): '22', (1, 0): '10', (0, 2): '02'}

或更短的听写理解:

d = { (r,c):cell for r,x in enumerate(board_1) for c,cell in enumerate(x) }

推荐阅读