2010-09-17 25 views
36

Tôi tự hỏi nếu có một cách dễ dàng để định dạng Strings của dict-đầu ra như thế này:Howto đầu ra chuỗi Format dict độc đáo

{ 
    'planet' : { 
    'name' : 'Earth', 
    'has' : { 
     'plants' : 'yes', 
     'animals' : 'yes', 
     'cryptonite' : 'no' 
    } 
    } 
} 

..., nơi một str đơn giản (dict) chỉ sẽ cung cấp cho bạn một khá đọc ...

{'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}} 

Đối với nhiều như tôi biết về Python tôi sẽ phải viết rất nhiều mã với nhiều trường hợp đặc biệt và String.Replace() gọi, nơi vấn đề này bản thân không giống như vậy giống như một vấn đề 1000 dòng.

Vui lòng đề xuất cách dễ nhất để định dạng bất kỳ dict nào theo hình dạng này.

Trả lời

65

Tùy thuộc vào những gì bạn đang làm với đầu ra, một tùy chọn là sử dụng JSON cho di splay.

import json 
x = {'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}} 

print json.dumps(x, indent=2) 

Output:

{ 
    "planet": { 
    "has": { 
     "plants": "yes", 
     "animals": "yes", 
     "cryptonite": "no" 
    }, 
    "name": "Earth" 
    } 
} 

Thông báo trước để phương pháp này là một số điều không serializable bởi JSON. Một số mã bổ sung sẽ được yêu cầu nếu dict chứa các mục không serializable như các lớp hoặc chức năng.

+3

Tốt, không bao giờ thấy tùy chọn thụt lề json này :) – ohe

+0

Tôi muốn cung cấp cho bạn nhiều hơn một lần cho phản hồi này. Tuyệt vời! Cảm ơn, người đàn ông! – erikbwork

+2

nó không hoạt động nếu một trong các giá trị là một đối tượng ngày ví dụ – archmage

27

Sử dụng pprint

import pprint 

x = { 
    'planet' : { 
    'name' : 'Earth', 
    'has' : { 
     'plants' : 'yes', 
     'animals' : 'yes', 
     'cryptonite' : 'no' 
    } 
    } 
} 
pp = pprint.PrettyPrinter(indent=4) 
pp.pprint(x) 

này kết quả đầu ra

{ 'planet': { 'has': { 'animals': 'yes', 
          'cryptonite': 'no', 
          'plants': 'yes'}, 
        'name': 'Earth'}} 

Chơi xung quanh với định dạng pprint và bạn có thể nhận được kết quả mong muốn.

+1

Vâng, nó chỉ có chiều sâu, chiều rộng và thụt lề làm thông số. Tôi không thấy một cách để làm cho hành tinh đi đến dòng tiếp theo. Chắc chắn, kết quả PP là tốt hơn có thể đọc được, nhưng newline + proper_spaces là nessesary cho trường hợp của tôi. Nhưng cảm ơn vì đã cho tôi thấy gói phần mềm tuyệt vời này. Đi kèm trong rất tiện dụng trong các trường hợp khác. – erikbwork

4
def format(d, tab=0): 
    s = ['{\n'] 
    for k,v in d.items(): 
     if isinstance(v, dict): 
      v = format(v, tab+1) 
     else: 
      v = repr(v) 

     s.append('%s%r: %s,\n' % (' '*tab, k, v)) 
    s.append('%s}' % (' '*tab)) 
    return ''.join(s) 

print format({'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}}) 

Output:

{ 
'planet': { 
    'has': { 
    'plants': 'yes', 
    'animals': 'yes', 
    'cryptonite': 'no', 
    }, 
    'name': 'Earth', 
    }, 
} 

Lưu ý rằng tôi sorta giả sử tất cả các phím là chuỗi, hoặc ít nhất là khá đối tượng ở đây

+1

Hoạt động như mong đợi. Dù sao, tôi hy vọng rằng ai đó có thể tìm thấy một giải pháp bao gồm tất cả pin. Nếu không có gì khác sau cuối tuần, tôi sử dụng giải pháp của bạn. Cảm ơn bạn đã giúp đỡ! – erikbwork

+0

Rơi xuống đệ quy vô hạn trên các hành vi tự bao gồm. –