python - 字典理解产生意想不到的结果
问题描述
我正在学习 Python,目前是字典理解。我玩弄不同的想法只是为了看看我得到了什么,而我得到了一个我真的不明白的。任何帮助理解我做错了什么都会非常感激。
具体来说,这段代码:
test_dict = {key: val
for key in ['a','b','c']
for val in range(3)}
print(test_dict)
产生以下字典:{'a': 2, 'b': 2, 'c': 2}
我期待着:{'a': 0, 'b': 1, 'c': 2}
当我运行这个快速循环时:
for val in range(3):
print(val)
我得到:
0
1
2
每个字典键都获得相同的值(范围迭代器的最终值)是否有原因?
我正在通过 Anaconda / Jupyter 笔记本运行 Python 3.6.5。
解决方案
让我们炸毁你的听写理解;它相当于以下内容:
test_dict = {}
for key in ['a','b','c']:
for val in range(3):
test_dict[key] = val
因此,对于每个键,您对字典执行三个不同的分配。自然,只保留最后一个。
要获得您想要的结果,只需为每个键分配一次。在这种情况下,一个明显的方法是使用enumerate()
对序列中的项目进行编号,然后将其用作值。
test_dict = {key: val for val, key in enumerate(['a','b','c'])}
对于任何两个序列的一般情况,使用zip()
:
test_dict = {key: val for key, val in zip(['a', 'b', 'c'], range(3))}
实际上,由于dict
构造函数很乐意使用一系列键/值对,您可以这样写:
test_dict = dict(zip(['a', 'b', 'c'], range(3)))
推荐阅读
- python - 如何将文件名从十六进制更改为字符?
- javascript - 如何将重复的数字排列在一起(最好是在一个数组中)并根据它的数字将它们分开?
- reactjs - 在 Boostrap-React 中使用容器流体?
- c# - 使用 C# 中的通用代码验证空的 TextBox、NumericUpdown 和 ComboBox
- c# - 在 Caliburn Micro 中的 ViewModel 之间切换
- javascript - 在 React.js 中,我试图在图像顶部的叠加层之上添加文本和其他一些项目
- django - 无法分配 [...] 必须是“CustomUser”实例
- ldap - 正则表达式的 OpenLDAP ACL 问题 - 服务器停止
- android-studio - 我们如何通过 android studio 中的任何查询来获取 youtube 视频的 url 和缩略图?
- git - 如何使用 pack-refs 创建裸仓库