python创建没有引用的字典列表

时间:2016-09-15 04:44:37

标签: python list dictionary

我有一个要求,我需要创建字典对象,并将重复键嵌入到列表对象中,如下所示:

[{ "key": "ABC" },{ "key": "EFG" } ]

我决定将顶级列表初始化为像outer_list=[]那样清空,以及像dict_obj= {}这样的占位符字典对象。接下来,我继续使用以下步骤将元素添加到我的列表中:

  1. 使用{ "key": "ABC" }
  2. dict_obj["key"]="ABC"分配给dict_obj
  3. 使用outer_list.append(dict_obj)
  4. 将此对象添加到列表中
  5. 使用dict_obj.clear()
  6. 刷新/弹出字典对象中的键/项
  7. 根据数据
  8. 中的键/项组合数重复步骤1至3

    问题:outer_list对象维护对原始dict_obj的引用,如果刷新dict_obj或添加新的键/项,则会相应更改。最后,我最终得到了[{ "key": "EFG" },{ "key": "EFG" } ]而不是[{ "key": "ABC" },{ "key": "EFG" } ]

    如果可能的话,请指导我一些解决方法。

2 个答案:

答案 0 :(得分:1)

我认为有两种方法可以避免重复引用。

第一个是append字典的副本,而不是对它的引用。 dict个实例有一个copy方法,所以这很容易。只需将当前append来电更改为:

即可
outer_list.append(dict_obj.copy())`

另一个选择是不总是使用相同的dict_obj对象,而是为每个条目创建一个单独的字典对象。在此版本中,您将dict_obj.clear()的来电替换为:

dict_obj = {}

对于第二种方法,您可以选择重新排序,而不是直接替换单行。您可以将设置代码移动到循环的开头,并在循环结束时摆脱重置逻辑。

也就是说,更改代码如下:

outer_list = []
dict_obj = {}
for foo in whatever:
    # add stuff to dict_obj
    outer_list.append(dict_obj)
    dict_obj.clear()

要:

outer_list = []
for foo in whatever:
    dict_obj = {}
    # add stuff to dict_obj
    outer_list.append(dict_obj)

如果用于创建内部词典的逻辑足够简单来计算,您甚至可以将整个事物转换为列表理解:

outer_list = [{"key": value, "key2": value2} for value, value2 in some_sequence]

答案 1 :(得分:0)

以下内容应该是不言自明的:

# object reuse
d = {}
l = []
d['key'] = 'ABC'
l.append(d)
d.clear()
print(l) # [{}] : cleared!
d['key'] = 'EFG'
l.append(d)
print(l) # [{'key': 'EFG'}, {'key': 'EFG'}]


# explicit creation of new objects
d = {}
l  = []
d['key'] = 'ABC'
l.append(d)
print(l)
d = {}
d['key'] = 'EFG'
l.append(d)
print(l)