首页 > 解决方案 > 字典理解产生意想不到的结果

问题描述

我正在学习 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。

标签: pythondictionary

解决方案


让我们炸毁你的听写理解;它相当于以下内容:

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)))

推荐阅读