Skip to main content
 首页 » 编程设计

python追加字典到列表

2025年05月04日22Free-Thinker

根据 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)