2010-09-17 21 views
36

Ben bu gibi acaba:Pratik Bilgiler Biçim dict dize çıkışları güzel

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

..., basit str (dict) Sadece sana verecek nerede oldukça okunmaz ...

kadar için
{'planet' : {'has': {'plants': 'yes', 'animals': 'yes', 'cryptonite': 'no'}, 'name': 'Earth'}} 

Ben birçok özel durumlarda ve String.Replace (ile kod çok yazmak zorunda kalacak Python hakkında bilmek gibi) çağrıları, bu sorun kendisini öylesine görünmüyor nerede 1000 satırlık bir problem gibi.

Lütfen bu şekle göre herhangi bir kuralı biçimlendirmenin en kolay yolunu önerin.

cevap

65

en azından güzel nesnelerdir farz ediyorum

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

Not neyi çıktı ile yapıyorsunuz, bir seçenek JSON kullanmak için di yayvan.

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

print json.dumps(x, indent=2) 

Çıktı:

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

Bu yaklaşıma ikaz bazı şeyler JSON tarafından seri hale getirilebilir değil olmasıdır. Dict, sınıflar veya işlevler gibi seri hale getirilemeyen öğeler içeriyorsa, bazı ekstra kodlar gerekli olacaktır.

+3

Güzel, bu json girinti seçeneklerini hiç görmedim :) – ohe

+0

Size bu cevap için bir tane daha vermek istiyorum. Sadece müthiş! Teşekkürler dostum! – erikbwork

+2

, değerlerden biri Date nesnesiyse işe yaramaz örneğin – archmage

27

Kullanım pprint

import pprint 

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

Bu

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

pprint biçimlendirme ile oynayın ve istediğiniz sonucu elde edebilirsiniz çıkarır.

+1

Sadece derinlik, genişlik ve parametreler olarak girinti var. Gezegeni bir sonraki hatta gitmenin bir yolunu görmüyorum. Elbette, PP sonuçları daha iyi okunabilir, ancak benim durumum için newline + proper_spaces nessesary. Ama bana bu güzel paketi gösterdiğin için teşekkürler. Diğer durumlarda çok kullanışlı gelir. – 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'}}) 

Çıktı: Ben de böyle bir bütün tuşlar dizeleri veya bağlı Burada

+1

Beklendiği gibi çalışır. Her neyse, umarım birileri piller dahil bir çözüm bulabilir. Hafta sonundan sonra başka bir şey yoksa, çözümünüzü kullanırım. Yardım ettiğin için teşekkür ederim! – erikbwork

+0

Kendinden dahil dicts üzerinde sonsuz özyineleme düşüyor. –