2012-12-23 12 views
5

私は、edgeweightの昇順に、私がnetworkxライブラリを通して読み込んだグラフオブジェクトをPythonでソートしたいと思っています。 Pythonのsortコマンドはグラフオブジェクトには適用されないようです。私はこのオブジェクトを簡単に並べ替える方法があると確信していますが、どうしたらよいか分かりません。どんな助けもありがとう。networkxグラフオブジェクトをソートするPython

は例えば、私の最初の3つのエッジは、私は彼らのためには、ここで

1 4 74 
1 5 3659 
1 3 5250 

に変更されていることを望んでいるだろう、ソート後

1 3 5250 
1 4 74 
1 5 3659 

ある私のコードは、これまで

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

ですオブジェクトgをソートしようとしています。

+0

「グラフオブジェクトをソートする」という意味を具体的に説明できますか?エッジウェイトを増加させることによって、エッジのリストを取得しますか?すべてのエッジにわたってエッジウェイトの合計を増加させることによって順序付けられたノードのリストを取得しますか?最大エッジ重みによって?等 – DSM

+0

私はエッジの重みを増やすことによって順序付けられたエッジのリストを取得する必要があります。それに応じて質問を更新します。 – hardikudeshi

答えて

8
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 
+0

これはソートを行いますが、オブジェクトはもはやグラフオブジェクトではなくなりました。オブジェクトをグラフオブジェクトとして保持することは可能ですか? – hardikudeshi

+0

'G'はまだ' Graph'オブジェクトです。 'G [a] [b]'で辺にアクセスすることができます。 – unutbu

+0

私はダイレクトグラフを使用しました。 forループは、Python 3で無効な構文エラーを出しているようです。何か不足していますか? – Bonson

3

組み込みのsort関数には、関数をとるkeyパラメータがあります。指定されている場合、sortは、元の要素へのキー関数の適用結果の順序に従ってコレクションをソートします。あなたは、エッジの重みでソートする必要があり、エッジのリストを持っている場合

>>> sorted([1,2,3], key=lambda x:-x) 
[3, 2, 1] 

あなたは、あなたの特定のケースではより多くの情報here

を見つけることができます、あなたはに端をマップする機能を提供する必要があり、その重量:

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

'sort'はグラフオブジェクトには当てはまりません。私は 'g.sort()'を試してみましたが、 '' Graph 'オブジェクトに属性' sort 'がありません。 – hardikudeshi

+0

@hardikudeshi実際には 'Graph'の関数ではありませんが、 'list'。 – goncalopp

関連する問題