2016-03-27 59 views
0

我想用dict.fromkeys()方法生成字典。我有一个list年,我想分配values他们list object。问题是dict.fromkeys()生成列表的副本。所以,当我更新列表的元素时,它会更新所有副本。Python dict.fromkeys()生成list()的副本而不是新的副本

>>> years=["1","2","3"] 
>>> names=["a","b","c"] 
>>> blank=[] 
>>> names_in_years=dict.fromkeys(years,blank.copy()) 
>>> names_in_years 
{'2': [], '4': [], '3': [], '1': []} 
>>> names_in_years["2"].extend(names) 
>>> names_in_years 
{'2': ['a', 'b', 'c'], '4': ['a', 'b', 'c'], '3': ['a', 'b', 'c'], '1': ['a', 'b', 'c']} 

我想更新dictionary对象,individually.the结果是低于我想:

{'2': ['a', 'b', 'c'], '4': [], '3': [], '1': []} 

是否有一行来做到这一点的方法?

+0

使用良好的词典理解。 –

回答

1

只是做

names_in_years["2"] = names_in_years["2"] + names 

,而不是笨重的

names_in_years["2"].extend(names) 

前者赋予新的价值,以旧人,后者变异到位返回值。在处理更新关键值时,分配通常比就地突变更安全和更简单。

+0

前者每次都会创建一个新的列表对象,如果我们正在处理巨大的列表,那么它就不那么有用。正确的解决方案是为每个键分配不同的对象以防止这种变化。 –

+0

这是真的,但我认为OP的具体问题是*密钥中的每个*值都已更新。 –

+1

没错,但问题在于他们如何初始化字典而不是使用'list.extend'。所以,'names_in_years = {k:[] for k years in}}'会解决这个问题。 –