根据appending-a-dictionary-to-a-list-in-a-a-loop-python">thispost,如果我想引用在循环中更新的字典(而不是总是引用同一个字典),我需要在字典上使用.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"
}
}
]
有人能告诉我我做错了什么吗?
使用
copy.deepcopy(your_dict)
:deepcopy。我看到一些东西。根据你想要的结果,你的优势列表有点偏离了。
更改:
致:
为了按照您希望的方式在所需的输出中创建数据,我们可以使用更基本的dicts方法来完成这项工作。
如果您试图匹配问题中所需的结果,那么您在
for e in edges_list
函数中调用的索引是错误的。应该是:
首先我删除了
因为我的方法不需要它。
接下来我改变了定义数据的方式。
我们可以直接将每组数据的结果附加到
ultimate_list
中,而不是使用预定义的字典。这缩短了代码,而且设置起来更容易一些。所以下面的代码:
应导致:
dict.copy
只生成dict的浅拷贝,嵌套的字典永远不会被复制,您也需要深拷贝来复制它们。但是,您只需在循环的每个迭代中定义每个新dict,然后在该迭代中追加新dict即可:
同样适用于
edge_dict
:相关问题 更多 >
编程相关推荐