2012-12-23 8 views
5

Chcę posortować obiekt wykresu, który przeczytałem przez bibliotekę networkx w Pythonie, w porządku rosnącym edgeweight. Wygląda na to, że polecenie Pythona sort nie ma zastosowania do obiektów wykresów. Jestem pewien, że istnieje łatwy sposób na sortowanie tego obiektu, ale nie jestem pewien jak. Każda pomoc zostanie doceniona.Sortowanie obiektu wykresu sieciowegox Python

Na przykład, moje pierwsze trzy krawędzie są

1 3 5250 
1 4 74 
1 5 3659 

Po sortowaniu Mam nadzieję, że ich kolejność jest zmieniana na

1 4 74 
1 5 3659 
1 3 5250 

Oto mój kod tak daleko

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

Próbuję posortować obiekt g.

+0

Czy możesz dokładniej określić, co rozumiesz przez "sortowanie obiektu graficznego"? Uzyskaj listę krawędzi zamówionych przez zwiększenie wagi krawędzi? Uzyskaj listę uporządkowanych węzłów, zwiększając sumę ciężaru krawędzi na wszystkich krawędziach? Maksymalną wagą krawędzi? Itd. – DSM

+0

Potrzebuję uzyskać listę krawędzi zamówionych przez zwiększenie wagi krawędzi. Odpowiednio zaktualizuję pytanie. – hardikudeshi

Odpowiedz

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'])) 

daje

1 4 74 
1 5 3659 
1 3 5250 
+0

To robi sortowanie, ale teraz obiekt nie jest już obiektem graficznym. Czy możliwe jest zachowanie obiektu jako obiektu wykresu. – hardikudeshi

+0

'G' jest nadal obiektem' Graph'. Możesz uzyskać dostęp do krawędzi za pomocą 'G [a] [b]'. – unutbu

+0

Użyłem bezpośredniego wykresu. Wydaje się, że pętla for podaje niepoprawny błąd składni w Pythonie 3. Czy coś mi brakuje? – Bonson

3

Wbudowana funkcja sort ma parametr key, który przyjmuje funkcję. Jeśli zostanie określony, sort posortuje kolekcję zgodnie z kolejnością wyniku zastosowania funkcji klucza do oryginalnych elementów.

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

można znaleźć więcej informacji here

W danym przypadku, jeśli trzeba sortować według wagi krawędzi i masz listę krawędzi, trzeba zapewnić funkcję która mapuje przewagę do jego waga:

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

Wygląda na to, że "sortowanie" nie ma zastosowania do obiektu wykresu. Kiedy próbowałem 'g.sort()' Mam błąd 'Obiekt 'Graph' nie ma atrybutu 'sort'' – hardikudeshi

+0

@hardikudeshi w rzeczy samej, nie jest funkcją' Graph', chociaż ma wbudowane typy takie jak 'lista'. Nadal możesz używać funkcji 'posortowane', ale – goncalopp

Powiązane problemy