2012-09-04 34 views
5

Tôi có một từ điển như được tạo bằng Python.Đầu ra In Đẹp theo định dạng cây ngang trong cửa sổ bảng điều khiển

d = {'a': ['Adam', 'Book', 4], 'b': ['Bill', 'TV', 6, 'Jill', 'Sports', 1, 'Bill', 'Computer', 5], 'c': ['Bill', 'Sports', 3], 'd': ['Quin', 'Computer', 3, 'Adam', 'Computer', 3], 'e': ['Quin', 'TV', 2, 'Quin', 'Book', 5], 'f': ['Adam', 'Computer', 7]} 

Tôi muốn in điều này theo định dạng cây ngang thay vì trên bảng điều khiển. Tôi đã thử in đẹp nhưng khi từ điển được lâu, nó trở nên khó đọc.

Ví dụ, với từ điển này, nó sẽ quay trở lại:

a -> Book -> Adam -> 4 
b -> TV -> Bill -> 6 
    -> Sports -> Jill -> 1 
    -> Computer -> Bill -> 5 
c -> Sports -> Bill -> 3 
d -> Computer -> Quin -> 3 
       -> Adam -> 3 
e -> TV -> Quin -> 2 
    Book -> Quin -> 5 
f -> Computer -> Adam -> 7 

Về cơ bản, in đẹp được tổ chức bởi các hoạt động, hoặc các mục ở vị trí thứ hai trong danh sách, sau đó theo tên và sau đó bởi con số.

Đầu ra mẫu ở trên chỉ là một ví dụ. Tôi đã thử làm việc với Pretty print a tree nhưng không thể tìm ra cách biến nó thành định dạng nằm ngang.

Trả lời

1
def treePrint(tree): 
    for key in tree: 
     print key, # comma prevents a newline character 
     treeElem = tree[key] # multiple lookups is expensive, even amortized O(1)! 
     for subElem in treeElem: 
      print " -> ", subElem, 
      if type(subElem) != str: # OP wants indenting after digits 
       print "\n " # newline and a space to match indenting 
     print "" # forces a newline 
+0

Trông tốt ... cách nào để làm cho nó tương tự như cây in khá một trong những nơi nó có một định dạng cây? – user1530318

+0

Nếu bạn đang tìm kiếm một số loại giải pháp chiều sâu cây đệ quy, bạn có thể có một trường hợp cơ bản nơi dữ liệu không thể lặp lại được, nếu không hãy tái sử dụng. Tôi không biết các mô-đun pprint rất tốt vì vậy tôi không thực sự biết những gì bạn đang hy vọng tôi có thể làm. – rsegal

+0

Sử dụng tên của một từ khóa như 'dict' cho một đối số hoặc tên biến được coi là hình thức xấu, như là kiểu kiểm tra. – martineau

3

Đây là cách tôi sẽ làm. Vì cây chỉ có hai cấp độ sâu - mặc dù định dạng đầu ra mong muốn của bạn có thể ngụ ý - không cần phải sử dụng đệ quy để duyệt nội dung của nó, vì lặp lại hoạt động khá tốt. Có lẽ đây không phải là mã #f mà bạn tham chiếu, vì tôi không biết ngôn ngữ, nhưng nó ngắn hơn và dễ đọc hơn - ít nhất là với tôi.

from itertools import izip 

def print_tree(tree): 
    for key in sorted(tree.iterkeys()): 
     data = tree[key] 
     previous = data[0], data[1], data[2] 
     first = True 
     for name, activity, value in izip(*[iter(data)]*3): # groups of three 
      activity = activity if first or activity != previous[1] else ' '*len(activity) 
      print '{} ->'.format(key) if first else ' ', 
      print '{} -> {} -> {}'.format(activity, name, value) 
      previous = name, activity, value 
      first = False 

d = {'a': ['Adam', 'Book', 4], 
    'b': ['Bill', 'TV', 6, 'Jill', 'Sports', 1, 'Bill', 'Computer', 5], 
    'c': ['Bill', 'Sports', 3], 
    'd': ['Quin', 'Computer', 3, 'Adam', 'Computer', 3], 
    'e': ['Quin', 'TV', 2, 'Quin', 'Book', 5], 
    'f': ['Adam', 'Computer', 7]} 

print_tree(d) 

Output:

a -> Book -> Adam -> 4 
b -> TV -> Bill -> 6 
    Sports -> Jill -> 1 
    Computer -> Bill -> 5 
c -> Sports -> Bill -> 3 
d -> Computer -> Quin -> 3 
       -> Adam -> 3 
e -> TV -> Quin -> 2 
    Book -> Quin -> 5 
f -> Computer -> Adam -> 7 

Cập nhật

Tổ chức sản xuất theo tên thay vì hoạt động bạn cần phải thay đổi ba dòng như được chỉ ra dưới đây:

from itertools import izip 

def print_tree(tree): 
    for key in sorted(tree.iterkeys()): 
     data = tree[key] 
     previous = data[0], data[1], data[2] 
     first = True 
     for name, activity, value in sorted(izip(*[iter(data)]*3)): # changed 
      name = name if first or name != previous[0] else ' '*len(name) # changed 
      print '{} ->'.format(key) if first else ' ', 
      print '{} -> {} -> {}'.format(name, activity, value) # changed 
      previous = name, activity, value 
      first = False 

Đầu ra sau khi sửa đổi:

a -> Adam -> Book -> 4 
b -> Bill -> Computer -> 5 
      -> TV -> 6 
    Jill -> Sports -> 1 
c -> Bill -> Sports -> 3 
d -> Adam -> Computer -> 3 
    Quin -> Computer -> 3 
e -> Quin -> Book -> 5 
      -> TV -> 2 
f -> Adam -> Computer -> 7 
+0

dòng 3 phải là dữ liệu = cây [khóa], không phải d [phím], phải không? – user1530318

+0

Ngoài ra, làm thế nào tôi sẽ làm điều đó nếu tôi muốn nó được tổ chức theo tên và không phải bởi các hoạt động, do đó, tổ chức bởi các yếu tố đầu tiên trong danh sách, không phải là thứ hai. a -> adam -> book -> 4 ví dụ – user1530318

+0

Có, dòng 3 sai (còn sót lại từ trước khi tôi tạo một hàm). Tôi đã cố định điều đó cũng như cập nhật câu trả lời của tôi để hiển thị nóng để sửa đổi nó để tổ chức đầu ra theo tên chứ không phải bằng hoạt động. – martineau

8

Bạn có thể xem mã số ETE toolkit. Chức năng _asciiArt sản xuất đại diện tốt đẹp của cây thậm chí with internal node labels

from ete2 import Tree 
t = Tree("(((A,B), C), D);") 
print t 

#    /-A 
#   /---| 
#  /---|  \-B 
# | | 
#----|  \-C 
# | 
#  \-D 
Các vấn đề liên quan