python将字典追加到列表

Posted

技术标签:

【中文标题】python将字典追加到列表【英文标题】:python append dictionary to list 【发布时间】:2018-03-01 13:39:30 【问题描述】:

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

谁能告诉我我在这里做错了什么?

【问题讨论】:

ultimate_list 听起来很特别 【参考方案1】:

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

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

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)

【讨论】:

现在工作。非常感谢!【参考方案2】:

使用copy.deepcopy(your_dict):deepcopy。

【讨论】:

【参考方案3】:

我看到了一些东西。根据您想要的结果,您的 edge_list 有点偏离。

变化:

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

【讨论】:

感谢您提供更优雅的解决方案!

以上是关于python将字典追加到列表的主要内容,如果未能解决你的问题,请参考以下文章

Python-追加/合并字典列表

遍历 Python 字典并特殊追加到新列表?

Python对字典列表进行去重追加

python中列表,字典,字符串常用操作

将列表中的字典追加到熊猫数据框

在python中怎么把列表中的元素添加到字典中