pythongraphnetworkxedges

NetworkX: how to add weights to an existing G.edges()?


Given any graph G created in NetworkX, I want to be able to assign some weights to G.edges() after the graph is created. The graphs involved are grids, erdos-reyni, barabasi-albert, and so forth.

Given my G.edges():

[(0, 1), (0, 10), (1, 11), (1, 2), (2, 3), (2, 12), ...]

And my weights:

{(0,1):1.0, (0,10):1.0, (1,2):1.0, (1,11):1.0, (2,3):1.0, (2,12):1.0, ...}

How can I assign each edge the relevant weight? In this trivial case all weights are 1.

I've tried to add the weights to G.edges() directly like this

for i, edge in enumerate(G.edges()):
    G.edges[i]['weight']=weights[edge]

But I get this error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-48-6119dc6b7af0> in <module>()
     10 
     11 for i, edge in enumerate(G.edges()):
---> 12     G.edges[i]['weight']=weights[edge]

TypeError: 'instancemethod' object has no attribute '__getitem__'

What's wrong? Since G.edges() is a list, why can't I access its elements as with any other list?


Solution

  • It fails because edges is a method.

    The documentation says to do this like:

    G[source][target]['weight'] = weight
    

    For example, the following works for me:

    import networkx as nx
    
    G = nx.Graph()
    
    G.add_path([0, 1, 2, 3])
    
    G[0, 1]['weight'] = 3
    
    >>> G.get_edge_data(0, 1)
    {'weight': 3}
    

    However, your type of code indeed fails:

    G.edges[0, 1]['weight'] = 3
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-14-97b10ad2279a> in <module>()
    ----> 1 G.edges[0][1]['weight'] = 3
    
    TypeError: 'instancemethod' object has no attribute '__getitem__'
    

    In your case, I'd suggest

    for e in G.edges():
        G[e[0], e[1]] = weights[e]