如何根据权重对 networkx 中的边进行排序

How to sort edges in networkx based on their weight

我在 python 中使用 NetworkX 进行网络分析。我确定每条边的权重并按以下方式将该边添加到图中:

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np


airports = ['ATL','LAX','ORD']
weights  = [500,200,150] #Note that in my real code I I calculated these weights, they are not provided
G = nx.Graph()
G.add_nodes_from(airports)

weightlst = []
airports_pos = []
checked_airports = []

i = 0
for airport1 in airports:
    for airport2 in airports:
        if airport1 != airport2 and  checked_airports.count([airport1,airport2])==0 and checked_airports.count([airport2,airport1])==0:
            weightedge = weights[i]
            weightlst.append(weightedge)
            weightedge = weightedge*0.0020+0.5
            G.add_edge(airport1, airport2, weight=weightedge)
    checked_airports.append([airport1,airport2])
    i = i + 1

对于上下文,每条边的权重表示两个机场之间发生了多少次航班,我的问题是不清楚哪个 'routes' 是 'busiest',因为不相关的边绘制在相关的。我希望最后画出权重最大的边,这样就可以清楚地知道网络中的'busiest flight routes'。

把所有的边数据放在一个列表中,然后用自定义键函数排序(这个很好查)。 NetworkX 可能没有任何功能来做你想做的事,因为它不需要。

使用:

edges=sorted(G.edges(data=True), key=lambda t: t[2].get('weight', 1))

添加到所选答案中,因为它可能感觉有些复杂...(由于声誉不足无法发表评论,编辑请求被拒绝¯\(ツ)/¯)

G.edges returns 添加到图 G 的边列表(每条边由 元组 两个元素:开始节点和结束节点),将其 data 属性设置为 True 包括为该列表中的每条边设置的权重作为 元组作为字典,其中权重的键是为边权重设置的属性名称(默认为'weight' ).

lambda 函数计算每个 元组 t 并通过第三个元素(即字典)比较它们获取与键 'weight' 对应的值,如果找不到该键则默认为 1。

需要注意的是如果你选择的边权重不是'weight'的属性名, 上面的代码行将不起作用,也不会显示任何错误,它什么都不做;因为它在所有情况下都默认返回 1 ,因为它找不到密钥,因此实际上什么都不排序。一条边可以具有不同解释的不同属性,因此请确保选择您要排序所依据的键。