字典理解产生意外结果

时间:2018-09-07 00:58:04

标签: python dictionary

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

2 个答案:

答案 0 :(得分:4)

让我们炸毁您对字典的理解;等效于以下内容:

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

答案 1 :(得分:2)

您的代码等效于2个嵌套的for循环,对于每个key,您依次有效地对所有test_dict[key] = val运行命令val,仅保留最后一个

您可能想要这个:

test_dict = {key: val for key,val in zip('abc', range(3))}

或直接

test_dict = dict(zip('abc', range(3)))