简体   繁体   English

AttributeError: 'set' 对象没有与 NetworkX 一起使用的属性 'number_of_nodes'

[英]AttributeError: 'set' object has no attribute 'number_of_nodes' working with NetworkX

I'm new to NetworkX, using NetworkX 2.5 and have some problems with deprecated code.我是 NetworkX 的新手,使用 NetworkX 2.5 并且在弃用代码方面存在一些问题。 The code is extracted from here .代码是从这里提取的。 I tried fixing some deprecated functions but can't get the code to work.我尝试修复一些已弃用的函数,但无法使代码正常工作。 I also don't understand how connected_components function works.我也不明白 connected_components 函数是如何工作的。

panama_nodes = panama.nodes()
relabel = {}

for f, cc, name in NODES:
    with open(f,encoding='utf8') as infile:
        kind = f.split(".")[0]
        data = csv.DictReader(infile)
        names_countries = {node["node_id"] :
                           (node[name].strip().upper(), node[cc])
                           for node in data
                           if node["node_id"] in panama_nodes}
    names =     {nid: values[0] for nid, values in names_countries.items()}
    countries = {nid: values[1] for nid, values in names_countries.items()}
    kinds =     {nid: kind      for nid, _      in names_countries.items()}
    nx.set_node_attributes(panama, countries, "countries")
    nx.set_node_attributes(panama, kinds, "kind")
    relabel.update(names)

nx.relabel_nodes(panama, relabel, copy=False)

if "ISSUES OF:" in panama:
    panama.remove_node("ISSUES OF:")

if "" in panama:
    panama.remove_node("")

print(nx.number_of_nodes(panama), nx.number_of_edges(panama))

components = [p.nodes() for p in nx.connected_components(panama)
              if nx.number_of_nodes(p) >= 20
              or nx.number_of_edges(p) >= 20]

panama0 = panama.subgraph(itertools.chain.from_iterable(components))

with open("panama-beneficiary.pickle", "wb") as outfile:
    pickle.dump(panama0, outfile)

These lines of code return an AttributeError:这些代码行返回一个 AttributeError:

components = [p.nodes() for p in nx.connected_components(panama)
              if nx.number_of_nodes(p) >= 20
              or nx.number_of_edges(p) >= 20]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-108e98bba596> in <module>
----> 1 components = [p.nodes() for p in nx.connected_components(panama)
      2               if nx.number_of_nodes(p) >= 20
      3               or nx.number_of_edges(p) >= 20]
      4 
      5 panama0 = panama.subgraph(itertools.chain.from_iterable(components))

<ipython-input-6-108e98bba596> in <listcomp>(.0)
      1 components = [p.nodes() for p in nx.connected_components(panama)
----> 2               if nx.number_of_nodes(p) >= 20
      3               or nx.number_of_edges(p) >= 20]
      4 
      5 panama0 = panama.subgraph(itertools.chain.from_iterable(components))

~\AppData\Local\Programs\Python\Python37\lib\site-packages\networkx\classes\function.py in number_of_nodes(G)
     83 def number_of_nodes(G):
     84     """Returns the number of nodes in the graph."""
---> 85     return G.number_of_nodes()
     86 
     87 

AttributeError: 'set' object has no attribute 'number_of_nodes'

Any help is appreciated!任何帮助表示赞赏!

connected_components only retrieves the set of nodes in NetworkX 2.5. connected_components仅检索NetworkX 2.5 中的节点集。 If I remember correctly in older version it returned the subgraphs.如果我在旧版本中没记错的话,它会返回子图。 To adjust the code you need to do the following:要调整代码,您需要执行以下操作:

components = [panama.subgraph(p).copy() for p in nx.connected_components(panama)]

# probably you want a list/set instead of a NodeView
components = [list(p.nodes()) for p in components
              if p.number_of_nodes(p) >= 20
              or p.number_of_edges(p) >= 20]

or directly或直接

components = [p for p in nx.connected_components(panama)
              if len(p) >= 20
              or panama.subgraph(p).number_of_edges() >= 20]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM