NetworkX errors while adding nodes: "unhashable type: 'dict'" and "ValueError: too many values to unpack (expected 2)"

NetworkX errors while adding nodes: "unhashable type: 'dict'" and "ValueError: too many values to unpack (expected 2)"

虽然 运行 下面的 NetworkX python 3.5 代码(在 Jupyter 中)我得到一个我不太明白的错误。 任何帮助是极大的赞赏。

import pandas as pd
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import os, warnings     
warnings.filterwarnings('ignore')
%matplotlib inline
%config InlineBackend.figure_format = 'retina'


## NODES

a = [ (  'a_%d' % i, {'a' : i}) for i in range(0,5) ]
b = [ (  'b_%d' % i, {'b' : i}) for i in range(0,5) ]
c = [ (  'c_%d' % i, {'c' : i}) for i in range(0,5) ]
d = [ (  'd_%d' % i, {'d' : i}) for i in range(0,5) ]

E = [ (  'E_%d' % h, {'a': i}, {'b': j}, {'c': k}, {'d': l} )
        for h in range(1,626) for i in range(0,5) 
        for j in range(0,5) for k in range(0,5) 
        for l in range(0,5) ]

## GRAPH initialization

testgraph = nx.Graph()
list_of_nodegroups = [a, b, c , d, E]

这就是它失败的地方:

## GRAPH construction - adding nodes

for ng1 in list_of_nodegroups1:
    testgraph.add_nodes_from(ng1)

我收到这个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.5/dist-packages/networkx/classes/graph.py in add_nodes_from(self, nodes_for_adding, **attr)
    535             try:
--> 536                 if n not in self._node:
    537                     self._adj[n] = self.adjlist_inner_dict_factory()

TypeError: unhashable type: 'dict'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-10-718f064c86a3> in <module>()
      1 for ng1 in list_of_nodegroups:
----> 2     testgraph.add_nodes_from(ng1)

/usr/local/lib/python3.5/dist-packages/networkx/classes/graph.py in add_nodes_from(self, nodes_for_adding, **attr)
    540                     self._node[n].update(attr)
    541             except TypeError:
--> 542                 nn, ndict = n
    543                 if nn not in self._node:
    544                     self._adj[nn] = self.adjlist_inner_dict_factory()

    ValueError: too many values to unpack (expected 2)

指的是(据我了解)两件事:

我正在尝试弄清楚如何解决这个问题,无论是在这段代码中还是在其他地方,非常感谢任何帮助!

编辑:

我的objective是有一个图由4种'children-nodes'组成a,b,c,d和1种'mother-nodes'是E,像这样:

[ ('E1', {'a0': 0, 'b0': 0, 'c0': 0, 'd0': 0} ),
  ('E2', {'a1': 1, 'b0': 0, 'c0': 0, 'd0': 0} ),
  ('E3', {'a1': 1, 'b1': 1, 'c0': 0, 'd0': 0} ),
   ...
  ('E625', {'a5': 5, 'b5': 5, 'c5': 5, 'd5': 5} ),
]

Documentation for Graph.add_nodes_from(nodes_for_adding, **attr): nodes_for_adding (iterable container) – 节点的容器(列表、字典、集合等)。或 (node, attribute dict) 元组的容器。使用属性字典更新节点属性。

列表中的每个元素 E 都是一个包含一个节点和 4 个字典的元组,而 add_nodes_from 只接受一个字典。这 4 个字典应该合并成一个字典:{'a': i, 'b': j, 'c': k, 'd': l}.

此外,列表 E 有 625 × 5⁴ = 390625 个元素。这是您的意图,还是您正在尝试枚举节点?如果你想枚举,它并没有像你预期的那样工作。相反,使用

from itertools import product

E = [('E_%d' % h, {'a': i, 'b': j, 'c': k, 'd': l})
     for h, (i, j, k, l) in enumerate(product(range(5), repeat=4), start=1)]