Python将字典添加到列表中

3

根据这篇文章,如果我要引用在循环中更新的字典(而不是始终引用相同的字典),我需要在字典上使用.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"
    }
  }
]

请问有人能告诉我这里我做错了什么吗?

(涉及IT技术)

ultimate_list听起来很特别 - Chris_Rands
3个回答

2

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)

现在可以工作了。非常感谢! - dliv

2
使用 copy.deepcopy(your_dict): deepcopy。请注意保留HTML标签。

1
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

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

更改为:


('daisy', 'minnie', '2')

To:

('minnie', 'daisy', '2')

为了按照您期望的输出方式创建数据,我们可以使用更基本的字典方法来实现。
如果您想在问题中匹配所需的结果,则在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"
    }
  }
]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接