python追加字典到列表

标签 python list dictionary append

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

相关文章:

Python强制输入是一个列表

python - 列表与数据框的交叉连接(笛卡尔积)

python - 如何在 Python 超过 10,000 行的文件中计算每个系统的系外行星?

python - 当通过子进程启动的应用程序关闭时Python执行操作

python - 值错误: list.删除(x): x not in list (But it is!)

python - 在 python(flask/Django) 字典 html 中使用 javascript 变量

Python 3 按值对字典列表进行排序,其中值以字符串开头

arrays - 如何通过elixir中的索引获取列表元素

python - 有没有办法 "fill in"一系列日期时间戳?

dictionary - 免费提供中文、日文、中日韩字符字典数据