I'm facing on a trouble related to how I'm managing the edges and their weight and attributes in a MultiDiGraph
.
I've a list of edges like below:
[
(0, 1, {'weight': {'weight': 0.8407885973127324, 'attributes': {'orig_id': 1, 'direction': 1, 'flip': 0, 'lane-length': 3181.294317920477, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lane-access-points': 6, 'lane-travel-time': 292.159682258003, 'lane-capacity': 7200.0, 'lane-cost': 0.8407885973127324, 'other-attributes': None, 'linestring-wkt': 'LINESTRING (434757.15286960197 4524762.33387408, 434267.30180536775 4525511.90463009, 436180.7891782945 4526762.385413274)'}}}),
(1, 4, {'weight': {'weight': 0.6659876355281887, 'attributes': {'orig_id': 131, 'direction': 1, 'flip': 0, 'lane-length': 2496.129360921626, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lan...
That list is used to add weight and attributes to a MultiDiGraph
previous mentioned:
graph = ntx.MultiDiGraph(weight=None)
graph.add_weighted_edges_from(edge_list)
Trying to read the properties of a single edge(graph.edges.data()
) I see this:
(0, 1, {'weight': {'weight': 0.8407885973127324, 'attributes': {'orig_id': 1, 'direction': 1, 'flip': 0, 'lane-length': 3181.294317920477, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lane-access-points': 6, 'lane-travel-time': 292.159682258003, 'lane-capacity': 7200.0, 'lane-cost': 0.8407885973127324, 'other-attributes': None, 'linestring-wkt': 'LINESTRING (434757.15286960197 4524762.33387408, 434267.30180536775 4525511.90463009, 436180.7891782945 4526762.385413274)'}}})
Every edge is builded in that way: [node[0], node[1], {'weight': weight, 'attributes': attributes}]
.
If I use this way: [node[0], node[1], weight]
, I see the right use of the weight but I need to use also the attributes.
[(0, 1, {'weight': 0.8407885973127324}), (1, 4, {'weight': 0.6659876355281887}), (1, 46, {'weight': None}), (4, 5, {'weight': 1.2046936800705539}), (4, 6, {'weight': 0.4469496439663275})....
What is the correct way to manage in the same time both weight and attributes?
Using add_weighted_edges_from
does not have an option to add independent edge attributes. It takes a list of triples (u,v,w)
and consider w
as the weight. That's why, you find a nested dictionary in the weight attribute of the node.
You can add shared attribute for the bunch by specifying keyword argument:
graph.add_weighted_edgees_from([...], attr1=..., attr2=...)
but you will find the same attribute values for all edges in the bunch.
Instead, you can directly use the add_edge
method in a for loop:
for u, v, attr in [...]:
graph.add_edge(u, v, **attr)
which will add your edges with individual attributes.