我有一个项目列表:
my_list = ['first', 'second', 'third']
我需要将这些项目转换为字典(因此我可以通过它的名称访问每个元素),并将多个计数器关联到每个元素:counter1,counter2,counter3。
所以我做了以下事情:
counter_dict = {'counter1': 0, 'counter2': 0, 'counter3': 0}
my_dict = dict(zip(mylist, [counter_dict]*len(mylist)))
这样我获得了一个嵌套字典
{
'first': {
'counter1': 0,
'counter2': 0,
'counter3': 0
},
'second': {
'counter1': 0,
'counter2': 0,
'counter3': 0
},
'third': {
'counter1': 0,
'counter2': 0,
'counter3': 0
}
}
这里的问题是每个计数器字典不是独立的,所以当我更新一个计数器时,所有计数器都会更新。
以下行不仅会更新counter2
的{{1}},还会更新second
和counter2
的{{1}}
first
我知道通过做third
我将所有词典都指向一个词典。
问题是,如何实现创建独立词典所需的内容? 最后我需要:
非常感谢
答案 0 :(得分:3)
您可以使用copy.deepcopy
复制字典并复制其内容。
import copy
而不是[counter_dict]*len(mylist)
使用方法:
[copy.deepcopy(counter_dict) for _ in mylist]
答案 1 :(得分:2)
试试这个:
my_dict = {k: counter_dict.copy() for k in my_list}
而不是压缩值 - 它足以迭代密钥并使用dict压缩将计数器复制到值。
但请注意,这只适用于一个级别的counter_dict。如果需要嵌套字典 - 请使用deepcopy
包中的copy
:
from copy import deepcopy
my_dict = {k: deepcopy(counter_dict) for k in my_list}
另一个方法 - 使用defaultdict
中的collections
,因此您甚至不需要使用预定义的计数器创建字典:
from collections import defaultdict
my_dict = {k: defaultdict(int) for k in my_list}
答案 2 :(得分:0)
使用列表推导而不是*
运算符,并为列表的每个元素创建一个新词典。
my_dict = dict(zip(mylist, [dict(counter_dict) for _ in mylist])
答案 3 :(得分:0)
您可以创建一个功能,只要您想分配一个counter_dict
,就会创建一个def create_counter_dict(length):
return {'counter{}'.format(n+1) : 0 for n in range(length)}
:
counter_dict
然后,当您想为my_dict
my_dict = dict(zip(my_list, [create_counter_dict(3) for _ in range(len(my_list))]))
时
Returns an object containing the properties top and left.
通过这种方式,您无需复制字典,也可以根据需要更改此工厂功能。