2013-01-25 23 views
13

Có ai biết thư viện Python nào cho phép bạn đơn giản và nhanh chóng cấp dữ liệu cho đối tượng được lồng vào các mức tùy ý hay không. những gì bạn sẽ tìm thấy trong this gist và nó có thể tạo ra một tệp biểu đồ cây khả thi?Thư viện Python để tạo biểu đồ cây ra khỏi các đối tượng Python lồng nhau (dicts)

Tính đơn giản là chìa khóa, ở đây, vì tôi phải có khả năng làm việc với những người không có đầu óc kỹ thuật.

Những gì tôi có nghĩa là bởi "cây đồ" là một cái gì đó dọc theo dòng sau đây, nơi tôi có thể ăn nó một cuốn từ điển lồng nhau của các giá trị và sau đó nó sẽ tạo ra cấu trúc cây:

http://dhaka.rubyforge.org/parse_tree.jpg

+0

Bạn có thể nói thêm về ý nghĩa của "tệp biểu đồ cây" không? Một ví dụ đầu vào/đầu ra và một số ý kiến ​​về cách bạn muốn sử dụng đầu ra sẽ rất hữu ích. – neirbowj

+0

@neirbowj nhận xét hay, cảm ơn; cập nhật – jdotjdot

Trả lời

3

vì vậy thư viện tôi khuyên bạn nên sử dụng cho đoạn mã của tôi trong câu trả lời này là không phải thư viện python, nhưng đó là thư viện thân thiện với python. mô-đun để xử lý dữ liệu và mã nước ngoài này sẽ kết nối với mã python còn tồn tại trên cả hai đầu, tức là cả đầu vào và đầu ra và tôi nghi ngờ, mặc dù tất nhiên tôi không biết, đó là tất cả điều đó thực sự có nghĩa là "thư viện python "tiêu chí. Vì vậy, nếu bạn đang viết một ứng dụng web, mã này sẽ là phía máy khách. Nói cách khác, thư viện này không phải là python, nhưng nó hoạt động với python.

  1. đầu vào của nó là (gần) dicts python liệu, cụ thể hơn, json.load (a_python_dict) trả về một mảng json hoặc đối tượng, một định dạng mà điều này javascript thư viện có thể tất nhiên nhận ra; và

  2. định dạng đầu ra là HTML hoặc SVG, không đối tượng trong một số định dạng ngôn ngữ cụ thể

Bạn có thể sử dụng d3.js.Nó có một class đặc biệt cho cây render:

var tree = d3.layout.tree().size([h, w]); 

Ngoài ra còn có một vài ví dụ về cây (mã làm việc) trong dụ thư mục trong nguồn d3, mà bạn có thể sao chép/tải hình thành liên kết tôi đã cung cấp ở trên.

Vì d3 là thư viện javascript, định dạng dữ liệu gốc của nó là JSON.

Cấu trúc cơ bản là một cuốn từ điển lồng nhau, mỗi từ điển đại diện cho một nút duy nhất với hai giá trị, tên của nút và con của nó (được lưu trữ trong một mảng), vừa khít với têntrẻ em, tương ứng :

{"name": "a_root_node", "children": ["B", "C"]} 

và tất nhiên nó đơn giản để chuyển đổi giữa các từ điển python và JSON:

>>> d = {"name": 'A', "children": ['B', 'C']} 
>>> import json as JSON 
>>> dj = JSON.dumps(d) 
>>> dj 
    '{"name": "A", "children": ["B", "C"]}' 

đây là một con trăn điển đại diện của một cây lớn hơn (một chục hay như vậy nút) mà tôi chuyển đổi sang JSON như trên, và sau đó kết xuất trong d3 như cây thể hiện trong hình dưới đây:

tree = {'name': 'root', 'children': [{'name': 'node 2', 'children': 
     [{'name': 'node 4', 'children': [{'name': 'node 10', 'size': 7500}, 
     {'name': 'node 11', 'size': 12000}]}, {'name': 'node 5', 'children': 
     [{'name': 'node 12', 'children': [{'name': 'node 16', 'size': 10000}, 
     {'name': 'node 17', 'size': 12000}]}, {'name': 'node 13', 'size': 5000}]}]}, 
     {'name': 'node 3', 'children': [{'name': 'node 6', 'children': 
     [{'name': 'node 14', 'size': 8000}, {'name': 'node 15', 'size': 9000}]}, 
     {'name': 'node 7', 'children': [{'name': 'node 8', 'size': 10000}, 
     {'name': 'node 9', 'size': 12000}]}]}]} 

tree represented as python dictionary rendered in d3:

lưu ý: d3 ám trong các trình duyệt ; hình ảnh trên chỉ là ảnh chụp màn hình của cửa sổ trình duyệt của tôi.

+8

-1: D3 là tuyệt vời và tất cả, nhưng một công cụ * Javascript * của nó, không phải Python. Nó không thực sự hữu ích nếu bạn đang mã hóa Python. –

+0

Yêu câu trả lời này. Cuối cùng tôi có một cách rõ ràng để hiển thị đầu ra từ một kịch bản python! – Andrew

5

tôi 'không chắc chắn rằng đây là những gì bạn có trong tâm trí, nhưng đó là điều đầu tiên mà đến với tâm trí.

blockdiag chủ yếu được dự định để được sử dụng làm bộ xử lý tệp độc lập tương tự như Graphviz (có giao diện Python). Nó chấp nhận một tệp văn bản làm đầu vào với cú pháp đơn giản thả xuống và tạo ra hình ảnh làm đầu ra.

Bạn có thể viết một shim đơn giản để xuất cấu trúc dict đệ quy của bạn được định dạng để nhập vào kịch bản blockdiag độc lập hoặc nhập các phần tử cần thiết của gói blockdiag và truyền trực tiếp đầu ra.

Nếu điều này có vẻ đầy hứa hẹn, tôi sẽ xem liệu tôi có thể lấy một số mã mẫu hay không.

EDIT đang Ví dụ:

def print_blockdiag(tree, parent=None): 
    if not parent: print('blockdiag { orientation = portrait') 
    for key in tree: 
     if parent: print(' {} -> {};'.format(parent, key)) 
     print_blockdiag(tree[key], key) 
    if not parent: print('}') 

Sản lượng này sẽ là một tập tin mà blockdiag thể đọc được.

-3

Tùy thuộc vào những gì bạn cần, nhưng nếu bạn chỉ cần nó để xem nội dung một cách dễ dàng, bạn có thể sử dụng công cụ trực tuyến cho điều đó - "Python dict formatter and viewer" có thể hiển thị dict dưới dạng cây.

+1

Tôi đã thử điều này và nó chỉ hiển thị một danh sách html. –

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