2012-12-23 12 views
5

Ich möchte ein Grafikobjekt, das ich durch NetworkX-Bibliothek in Python gelesen habe, in der Reihenfolge der Kantengewichtung sortieren. Es scheint, dass der Befehl sort von Python nicht auf Grafikobjekte angewendet wird. Ich bin mir sicher, dass es eine einfache Möglichkeit gibt, dieses Objekt zu sortieren, aber ich bin mir nicht sicher, wie. Jede Hilfe wird geschätzt.Sortieren eines NetzwerkX-Diagrammobjekts Python

Zum Beispiel meine ersten drei Kanten sind

1 3 5250 
1 4 74 
1 5 3659 

Nach dem Sortieren Ich würde hoffen, dass ihre Bestellung

1 4 74 
1 5 3659 
1 3 5250 

Hier zu

geändert wird, ist mein Code so weit

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

Ich versuche das Objekt g zu sortieren.

+0

Könntest du genauer sagen, was du mit "Grafikobjekt sortieren" meinst? Erhalten Sie eine Liste der Kanten, die geordnet werden, indem Sie Kantengewicht erhöhen? Erhalten Sie eine Liste der Knoten, die geordnet sind, indem Sie die Summe des Kantengewichts über alle Kanten erhöhen? Durch maximales Kantengewicht? Etc. – DSM

+0

Ich muss die Liste der Kanten erhalten, die durch zunehmendes Kantengewicht bestellt werden. Ich werde die Frage entsprechend aktualisieren. – hardikudeshi

Antwort

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

Dies die Sortierung tut, aber jetzt ist das Objekt nicht mehr ein Diagrammobjekt. Ist es möglich, das Objekt als Grafikobjekt beizubehalten? – hardikudeshi

+0

'G' ist immer noch ein' Graph'-Objekt. Sie können auf die Kanten mit 'G [a] [b]' zugreifen. – unutbu

+0

Ich habe ein Direct Graph verwendet. Die For-Schleife scheint einen ungültigen Syntaxfehler in Python 3 zu geben. Vermisse ich etwas? – Bonson

3

Die eingebaute sort Funktion hat einen key Parameter, der eine Funktion übernimmt. Wenn es angegeben ist, sortiert sort die Sammlung nach der Reihenfolge des Ergebnisses der Anwendung der Schlüsselfunktion zu den ursprünglichen Elementen.

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

Sie können mehr Informationen finden here

In Ihrem speziellen Fall, wenn Sie mit dem Kantengewicht zu sortieren brauchen, und Sie haben eine Liste von Kanten, müssen Sie die Funktion zur Verfügung zu stellen, die eine Kante bildet seine Gewicht:

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

Es scheint, dass die "Sortierung" nicht auf Graph-Objekte zutrifft. Als ich 'g.sort()' 'versuchte, bekam ich einen Fehler' "Diagramm" Gegenstand hat kein Attribut "sortieren" – hardikudeshi

+0

@hardikudeshi tatsächlich, es ist nicht eine Funktion von 'Diagramm', obwohl es von einigen eingebauten Typen wie ist 'Liste'. Sie können immer noch die "sortierte" Funktion verwenden, obwohl – goncalopp