python-3.x - 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_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 字典做些什么?任何帮助,将不胜感激。
解决方案
索引返回列表中第一次出现的值 - 因此您的所有值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) }
推荐阅读
- python - 使用 Python ftplib 删除 .htaccess
- sql - 计算有多少用户同时拥有 A 月和 B 月
- jquery - 我想在 yii2 的 gridview 中添加顶部和底部滚动条
- c - 查找每个矩阵行中最大数的列索引的高效 C 代码
- amazon-redshift - 访问部署在 VPC 中的 Redshift 集群
- selenium - 为 geckodriver 使用自定义 firefox 浏览器版本功能
- c# - 生成和下载带有部分视图的 PDF 时出现问题
- c# - 将两个列表变量组合成一个操作
- html - 使用 sed 将所有出现的 JS 替换为空行
- c - 我的系统调用实现中缺少什么?