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)
我一直在研究一个 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)