gpt4 book ai didi

python追加字典到列表

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:55 25 4
gpt4 key购买 nike

根据 this post,如果我想引用一个在循环中更新的字典(而不是总是引用同一个字典),我需要在字典上使用 .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"
}
}
]

谁能告诉我我做错了什么?

最佳答案

dict.copy 只对字典进行浅拷贝,永远不会复制嵌套字典,您需要深层复制才能将那些也复制过来。

但是,您可以简单地在循环的每次迭代中定义每个新字典,然后在该迭代中 append 新字典:

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)

关于python追加字典到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com