web-dev-qa-db-fra.com

Comment bien formater les sorties de chaîne de dict

Je me demande s'il existe un moyen facile de formater des chaînes de sorties dict telles que celle-ci:

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

..., où un simple str (dict) vous donnerait juste un tout à fait illisible ...

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

Pour autant que je sache sur Python je devrais écrire beaucoup de code avec de nombreux cas spéciaux et des appels string.replace (), où ce problème lui-même ne ressemble pas tellement à un 1000 -lignes-problème.

Veuillez suggérer la manière la plus simple de formater n'importe quel dict en fonction de cette forme.

55
erikbwork

Selon ce que vous faites avec la sortie, une option consiste à utiliser JSON pour l'affichage.

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

print json.dumps(x, indent=2)

Production:

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

La mise en garde à cette approche est que certaines choses ne sont pas sérialisables par JSON. Un code supplémentaire serait nécessaire si le dict contenait des éléments non sérialisables comme des classes ou des fonctions.

88
David Narayan

Utiliser pprint

import pprint

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

Cette sorties

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

Jouez avec le formatage de l'impression et vous pouvez obtenir le résultat souhaité.

37
pyfunc
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'}})

Production:

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

Notez que je suppose que toutes les clés sont des chaînes, ou du moins de jolis objets ici

6
Knio