Python:如何在列表中追加字典键的值而不是引用?

时间:2012-06-08 10:22:14

标签: python list dictionary

我有一个字典,由每个键中的名称和列表组成,如下所示:

dict1={}
for i in names:
    dict1[i]=[]

然后,我处理一个csv文件,我找到了我需要的结果,我将它附加到相应的dictonary值,然后在列表中追加名称和字典值,如下所示:

list1=[]
for i2 in data:
    total_score=sum(i2[1:4])
    dict1[i2[0]].append(total_score)
    list1.append([i2[0],dict1[i2[0]]])

如果我尝试打印list1的元素,我会得到每个键的最终列表,而不是progessive列表。

结尾列表应如下所示:

list1=[[name1,[50]],[name1,[50,60]],[name1,[50,60,0,85]]]

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:2)

除非你将克隆你的清单,否则它只会有一个副本(用你的话说,最后一个)。 如果我理解你想要的东西,解决方案就像

list1=[]
for i2 in data:
    total_score=sum(i2[1:4])
    templist = dict1[i2[0]][:]
    templist.append(total_score)
    list1.append([i2[0],templist])

有关详细信息,请参阅http://docs.python.org/library/copy.html

答案 1 :(得分:1)

只需改变:

    list1.append([i2[0],dict1[i2[0]]]) 

为:

    list1.append([i2[0],dict1[i2[0]][:]])

这将复制dict1中列表的当前值,而不是仅仅引用它。

(我猜这个追加曾经是一个打印语句,只会在dict1中显示列表的当前值。但是当你将它保存到list1中时,你保存对列表的引用,而不是副本。[:]切片操作符进行复制,因此不会将对键i2[0]列表的附加追加添加到副本中。)