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