我有一个要求,我需要创建字典对象,并将重复键嵌入到列表对象中,如下所示:
[{ "key": "ABC" },{ "key": "EFG" } ]
我决定将顶级列表初始化为像outer_list=[]
那样清空,以及像dict_obj= {}
这样的占位符字典对象。接下来,我继续使用以下步骤将元素添加到我的列表中:
{ "key": "ABC" }
dict_obj["key"]="ABC"
分配给dict_obj
outer_list.append(dict_obj)
dict_obj.clear()
问题:outer_list
对象维护对原始dict_obj
的引用,如果刷新dict_obj
或添加新的键/项,则会相应更改。最后,我最终得到了[{ "key": "EFG" },{ "key": "EFG" } ]
而不是[{ "key": "ABC" },{ "key": "EFG" } ]
如果可能的话,请指导我一些解决方法。
答案 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)