python将字典追加到列表
Posted
技术标签:
【中文标题】python将字典追加到列表【英文标题】:python append dictionary to list 【发布时间】:2018-03-01 13:39:30 【问题描述】:根据this 的帖子,如果我想引用一个循环更新的字典(而不是总是引用同一个字典),我需要在字典上使用.copy()
。但是,在我下面的代码示例中,这似乎不起作用:
main.py
:
import collections
import json
nodes_list = ['donald', 'daisy', 'mickey', 'minnie']
edges_list = [('donald', 'daisy', '3'), ('mickey', 'minnie', '3'), ('daisy', 'minnie', '2')]
node_dict, edge_dict = collections.defaultdict(dict), collections.defaultdict(dict)
ultimate_list = []
for n in nodes_list:
node_dict["data"]["id"] = str(n)
ultimate_list.append(node_dict.copy())
for e in edges_list:
edge_dict["data"]["id"] = str(e[2])
edge_dict["data"]["source"] = e[0]
edge_dict["data"]["target"] = e[1]
ultimate_list.append(edge_dict.copy())
print(json.dumps(ultimate_list, indent=2))
因此,我得到以下结果:
[
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"id": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
]
而我实际上希望得到这个:
[
"data":
"id": "donald"
,
"data":
"id": "daisy"
,
"data":
"id": "mickey"
,
"data":
"id": "minnie"
,
"data":
"target": "donald",
"id": "3",
"source": "daysi"
,
"data":
"target": "mickey",
"id": "3",
"source": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daysi"
]
谁能告诉我我在这里做错了什么?
【问题讨论】:
ultimate_list
听起来很特别
【参考方案1】:
dict.copy
只制作字典的浅拷贝,嵌套字典永远不会被复制,您也需要深拷贝才能将它们复制过来。
但是,您可以简单地在循环的每次迭代中定义每个新字典,并在该迭代中附加新字典:
for n in nodes_list:
node_dict = collections.defaultdict(dict) # create new instance of data structure
node_dict["data"]["id"] = str(n)
ultimate_list.append(node_dict)
同样适用于edge_dict
:
for e in edges_list:
edge_dict = collections.defaultdict(dict)
...
ultimate_list.append(edge_dict)
【讨论】:
现在工作。非常感谢!【参考方案2】:使用copy.deepcopy(your_dict)
:deepcopy。
【讨论】:
【参考方案3】:我看到了一些东西。根据您想要的结果,您的 edge_list 有点偏离。
变化:
('daisy', 'minnie', '2')
收件人:
('minnie', 'daisy', '2')
要以您希望的方式在所需的输出中创建数据,我们可以使用更基本的 dicts 方法来做到这一点。
如果您试图匹配问题中的预期结果,那么您在 for e in edges_list
函数中调用了错误的索引。
应该是:
"target" : e[0]
"id" : str(e[2])
"source" : e[1]
首先我删除了
node_dict, edge_dict = collections.defaultdict(dict), collections.defaultdict(dict)
因为我的方法不需要它。
接下来我改变了你定义数据的方式。
我们可以直接将每组数据的结果附加到ultimate_list
,而不是使用预定义的字典。这会缩短代码并且更容易设置。
for n in nodes_list:
ultimate_list.append("data" : "id" : str(n))
for e in edges_list:
ultimate_list.append("data" : "target" : e[0], "id" : str(e[2]), "source" : e[1])
print(json.dumps(ultimate_list, indent=2))
所以下面的代码:
import collections
import json
nodes_list = ['donald', 'daisy', 'mickey', 'minnie']
edges_list = [('donald', 'daisy', '3'), ('mickey', 'minnie', '3'), ('minnie', 'daisy', '2')]
ultimate_list = []
for n in nodes_list:
ultimate_list.append("data" : "id" : str(n))
for e in edges_list:
ultimate_list.append("data" : "target" : e[0], "id" : str(e[2]), "source" : e[1])
print(json.dumps(ultimate_list, indent=2))
应该导致:
[
"data":
"id": "donald"
,
"data":
"id": "daisy"
,
"data":
"id": "mickey"
,
"data":
"id": "minnie"
,
"data":
"target": "donald",
"id": "3",
"source": "daisy"
,
"data":
"target": "mickey",
"id": "3",
"source": "minnie"
,
"data":
"target": "minnie",
"id": "2",
"source": "daisy"
]
【讨论】:
感谢您提供更优雅的解决方案!以上是关于python将字典追加到列表的主要内容,如果未能解决你的问题,请参考以下文章