2012-12-23 48 views
5

Tôi muốn sắp xếp một đối tượng đồ thị mà tôi đã đọc qua thư viện networkx bằng Python, theo thứ tự tăng dần của edgeweight. Dường như lệnh sort của python sẽ không áp dụng cho các đối tượng đồ thị. Tôi chắc chắn có một cách dễ dàng để sắp xếp đối tượng này, nhưng tôi không chắc chắn làm thế nào. Bất kỳ trợ giúp sẽ được đánh giá cao.Sắp xếp đối tượng biểu đồ dạng mạng Python

Ví dụ, ba cạnh đầu tiên của tôi là

1 3 5250 
1 4 74 
1 5 3659 

Sau khi sắp xếp Tôi hy vọng rằng thứ tự của chúng được thay đổi để

1 4 74 
1 5 3659 
1 3 5250 

Đây là mã của tôi cho đến nay

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

Tôi đang cố gắng sắp xếp đối tượng g.

+0

Bạn có thể cụ thể hơn về ý nghĩa của việc "sắp xếp đối tượng biểu đồ" không? Nhận danh sách các cạnh được sắp xếp theo tăng trọng lượng cạnh? Nhận danh sách các nút được sắp xếp theo cách tăng tổng trọng lượng cạnh trên tất cả các cạnh? Bởi trọng lượng cạnh tối đa? Vv – DSM

+0

Tôi cần lấy danh sách các cạnh được sắp xếp theo trọng lượng cạnh tăng. Tôi sẽ cập nhật câu hỏi cho phù hợp. – hardikudeshi

Trả lời

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

mang

1 4 74 
1 5 3659 
1 3 5250 
+0

Điều này thực hiện sắp xếp, nhưng bây giờ đối tượng không còn là đối tượng biểu đồ nữa. Có thể giữ lại đối tượng như một đối tượng đồ thị hay không. – hardikudeshi

+0

'G' vẫn là đối tượng' Đồ thị'. Bạn có thể truy cập các cạnh bằng 'G [a] [b]'. – unutbu

+0

Tôi đã sử dụng Biểu đồ trực tiếp. Vòng lặp for dường như đang đưa ra một lỗi cú pháp không hợp lệ trong Python 3. Tôi có thiếu gì đó không? – Bonson

3

Chức năng sort tích hợp có thông số key có chức năng. Nếu được chỉ định, sắp xếp sẽ sắp xếp bộ sưu tập theo thứ tự kết quả của việc áp dụng chức năng chính cho các phần tử gốc.

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

Bạn có thể tìm thêm thông tin here

Trong trường hợp cụ thể của bạn, nếu bạn cần để sắp xếp theo trọng số cạnh và bạn có một danh sách các cạnh, bạn cần phải cung cấp các chức năng mà các bản đồ một cạnh để nó trọng lượng:

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

Dường như 'sắp xếp' không áp dụng cho đối tượng đồ thị. Khi tôi cố gắng 'g.sort()' tôi đã nhận một lỗi '' Graph 'đối tượng không có thuộc tính' sort'' – hardikudeshi

+0

@hardikudeshi thực sự, nó không phải là một chức năng của 'Graph', mặc dù nó là một số loại built-in như 'list'. Bạn vẫn có thể sử dụng hàm 'được sắp xếp', mặc dù – goncalopp

Các vấn đề liên quan