Python append dictionary to list

2024-05-19 20:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

根据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"
    }
  }
]

有人能告诉我我做错了什么吗?


Tags: inidsourcetargetdata字典dictlist
3条回答

使用copy.deepcopy(your_dict)deepcopy

我看到一些东西。根据你想要的结果,你的优势列表有点偏离了。

更改:

('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"
    }
  }
]

dict.copy只生成dict的浅拷贝,嵌套的字典永远不会被复制,您也需要深拷贝来复制它们。

但是,您只需在循环的每个迭代中定义每个新dict,然后在该迭代中追加新dict即可:

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)

相关问题 更多 >