压缩到dict时需要独立的对象

时间:2017-10-13 12:29:30

标签: python dictionary reference

我有一个项目列表:

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}},还会更新secondcounter2的{​​{1}}

first

我知道通过做third我将所有词典都指向一个词典。

问题是,如何实现创建独立词典所需的内容? 最后我需要:

  • 将列表中的每个元素作为键
  • 每个元素都有多个我可以独立更新的计数器

非常感谢

4 个答案:

答案 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.

通过这种方式,您无需复制字典,也可以根据需要更改此工厂功能。