对一个networkx图形对象进行排序的Python方法

8
我希望能够对通过Python的networkx库读取的图形对象按照边权重的增序进行排序。似乎Python的“sort”命令无法应用于图形对象。我相信有一种简单的方法可以对此对象进行排序,但我不确定如何操作。任何帮助将不胜感激。
例如,我的前三条边是:
1 3 5250
1 4 74
1 5 3659

排序后,我希望它们的顺序被改变为

1 4 74
1 5 3659
1 3 5250

这是我目前的代码

import networkx as nx
g=nx.read_weighted_edgelist(fname,nodetype=int)

我正在尝试对对象g进行排序。

你能具体说明一下“对图对象进行排序”的含义吗?是获取按边权重递增排序的边列表吗?还是获取按所有边的边权重总和递增排序的节点列表?或者是按最大边权重排序?等等。 - DSM
我需要按边权重递增的顺序获取边列表。我会相应地更新问题。 - hardikudeshi
2个回答

17
import networkx as nx
edgelist = [
    (1, 3, {'weight':5250}),
    (1, 4, {'weight': 74}),
    (1, 5, {'weight': 3659})]

G = nx.Graph(edgelist)
for a, b, data in sorted(G.edges(data=True), key=lambda x: x[2]['weight']):
    print('{a} {b} {w}'.format(a=a, b=b, w=data['weight']))
产出。
1 4 74
1 5 3659
1 3 5250

1
这个操作完成了排序,但是现在对象不再是一个图形对象了。有没有可能将对象保留为图形对象? - hardikudeshi
G 仍然是一个 Graph 对象。你可以通过 G[a][b] 访问边。 - unutbu
我使用了一个有向图。在Python 3中,for循环似乎会出现无效语法错误。我是不是漏掉了什么? - Bonson
2
@Bonson:感谢提醒。在Python3中,元组参数解包已被移除。我已经更新了上面的代码以适应Python3。 - unutbu

6
内置的sort函数有一个key参数,它接受一个函数。如果指定了该参数,sort函数将根据将原始元素应用于键函数的结果的顺序对集合进行排序。
>>> sorted([1,2,3], key=lambda x:-x)
[3, 2, 1]

你可以在这里找到更多信息:点击此处

对于你的特定情况,如果你需要按边权重排序并且有一组边的列表,你需要提供将边映射到其权重的函数:

sorted( list_of_edges, key= lambda edge: edge['weight'] ) 

似乎sort不适用于图形对象。当我尝试使用g.sort()时,出现了错误'Graph' object has no attribute 'sort' - hardikudeshi
@hardikudeshi 的确,这不是 Graph 的函数,但它是一些内置类型(如 list)的函数。您仍然可以使用 sorted 函数。 - loopbackbee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接