Python 词典未按预期打印

Python Dictionary Not Printing as I Expected

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

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;然而,我只是在 return 中得到这个:

{(0, 0): None}

似乎字典在仅给出第一个键值对后就停止了,之后忽略了所有内容。我假设我的代码有问题,比如我的逻辑可能在嵌套循环中被关闭了。然而令人难以置信的是,当我决定创建 board_2 的另一个版本时,这次是 board_1,其中 board_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 词典的其他事情? 任何帮助将不胜感激。

索引 returns 列表中值的 第一次 出现 - 因此所有 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) }

在您的第一个实现中,所有的行和单元格都是相同的值,因此当您调用 list.index 时,它会获取相同子列表的第一次出现。在这种情况下,您需要使用 enumerate 来记录迭代值,如下所示:

for i, row in enumerate(board_1):
    for j, cell in enumerate(row):
        board_position[(i, j)] = cell

这里的问题是 index 函数,它将遍历给定的列表以找到匹配的 first 值。当数组为空时,它正在寻找 [None, None, None] 的数组。这将每次匹配 first 行!同样在查找每行中每个元素的索引时。使用计数器更好,更有效:

row_pos = 0
for row in board_1:
    cell_pos = 0
    for cell in row:
        board_position[(row_pos, cell_pos)] = board_1[row_pos][cell_pos]
        cell_pos += 1
    row_pos += 1

print(board_position)