添加节点时出现NetworkX错误:"不可用类型:' dict'"和" ValueError:解压缩的值太多(预期2)"

时间:2018-04-11 10:28:59

标签: python-3.5 networkx dictionary-comprehension

在运行下面的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)

参考(据我所知)2件事:

  • &#34;不可用类型:&#39; dict&#39;&#34;
  • &#34; ValueError:要解压的值太多(预期为2)&#34;

我正在试图弄清楚如何在这段代码或其他地方解决这个问题,并且非常感谢任何帮助!

编辑:

我的目标是制作一个由4种类型的儿童节点组成的图表&#39;是a,b,c,d和1种类型的母节点&#39;是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} ),
]

1 个答案:

答案 0 :(得分:1)

Documentation for Graph.add_nodes_from(nodes_for_adding, **attr)nodes_for_adding(可迭代容器) - 节点容器(列表,字典,集等)。或(节点,属性字典)元组的容器。使用属性dict更新节点属性。

列表E中的每个元素都是一个包含一个节点和4个dicts的元组,而add_nodes_from只接受一个dict。这4个dicts应该合并为一个单词:{'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)]