Comment imprimer un dictionnaire ligne par ligne en Python?

166

Ceci est le dictionnaire

cars = {'A':{'speed':70,
        'color':2},
        'B':{'speed':60,
        'color':3}}

Utiliser ceci for loop

for keys,values in cars.items():
    print(keys)
    print(values)

Il imprime ce qui suit:

B
{'color': 3, 'speed': 60}
A
{'color': 2, 'speed': 70}

Mais je veux que le programme l'imprime comme ceci:

B
color : 3
speed : 60
A
color : 2
speed : 70

Je viens de commencer à apprendre les dictionnaires, donc je ne sais pas comment faire cela.

Jett
la source

Réponses:

142
for x in cars:
    print (x)
    for y in cars[x]:
        print (y,':',cars[x][y])

production:

A
color : 2
speed : 70
B
color : 3
speed : 60
namit
la source
12
Je sais que c'est vieux, mais j'ai pensé qu'il serait intéressant de mentionner que cela ne fonctionne pas si les voitures [x] sont des nombres entiers. Ce n'est pas ce que le PO demandait, alors je le dis simplement à quiconque tombe sur cela en supposant que c'est une solution globale.
Darrel Holt le
@DarrelHolt savez-vous comment le faire fonctionner avec des entiers? Parce que c'est le problème auquel je suis actuellement confronté
theprowler
@theprowler Le plus proche que je puisse obtenir pour recréer le problème est de savoir si cars = {1:4, 2:5}alors cars[x]est un entier mappé à la clé xplutôt qu'un ensemble mappé à la clé x. Dans ce cas, vous n'avez pas besoin d'utiliser la for y in cars[x]:ligne car il n'y a qu'une seule valeur que vous récupérez, sauf si vous utilisez quelque chose comme une liste ou un ensemble d'entiers, cela devrait fonctionner. Désolé, cela fait quelques mois, donc je ne me souviens pas complètement comment je suis arrivé à la conclusion de mon commentaire précédent. Vous pouvez m'envoyer votre code et je peux voir si je peux vous aider
Darrel Holt
Hmm. Je pense que mon problème est encore pire que cela. Fondamentalement, j'ai analysé certaines données d'une table HTML, et je les ai stockées dans un dictionnaire, et maintenant j'essaie de prendre ces données de dictionnaire et de les mettre dans un DataFrame avant de les exporter dans une table Oracle. ... c'est assez détaillé, je sais, mais l'étape qui me retient en ce moment est de mettre les données dans un DataFrame .... mon dictionnaire pour une raison quelconque a une clé et toutes les données sont en valeurs, donc c'est difficile essayant de le mettre proprement en lignes et en colonnes ..
theprowler
118

Vous pouvez utiliser le jsonmodule pour cela. La dumpsfonction de ce module convertit un objet JSON en une chaîne correctement formatée que vous pouvez ensuite imprimer.

import json

cars = {'A':{'speed':70, 'color':2},
        'B':{'speed':60, 'color':3}}

print(json.dumps(cars, indent = 4))

La sortie ressemble à

{
    "UNE": {
        "couleur": 2,
        "vitesse": 70
    },
    "B": {
        "couleur": 3,
        "vitesse": 60
    }
}

La documentation spécifie également un tas d'options utiles pour cette méthode.

kchak
la source
2
vrai, le contenu du dict doit être sérialisable dans json, cependant, la sortie fournie ici est beaucoup plus propre (par exemple, lisible par l'homme) que la sortie produite par pprint.PrettyPrinter. spécifiquement dans le domaine de l'indentation cohérente et de la suppression des préfixes de chaîne tels que u'foo '.
Buffalo Rabor
je fais print(json.dumps(cars, indent=4, ensure_ascii=False)) parce que sinon les caractères non ASCII sont illisibles.
Boris le
85

Une solution plus généralisée qui gère les dicts et les listes imbriqués de manière arbitraire serait:

def dumpclean(obj):
    if isinstance(obj, dict):
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print k
                dumpclean(v)
            else:
                print '%s : %s' % (k, v)
    elif isinstance(obj, list):
        for v in obj:
            if hasattr(v, '__iter__'):
                dumpclean(v)
            else:
                print v
    else:
        print obj

Cela produit la sortie:

A
color : 2
speed : 70
B
color : 3
speed : 60

J'ai rencontré un besoin similaire et j'ai développé une fonction plus robuste comme exercice pour moi-même. Je l'inclus ici au cas où cela pourrait être utile à un autre. En exécutant nosetest, j'ai également trouvé utile de pouvoir spécifier le flux de sortie dans l'appel afin que sys.stderr puisse être utilisé à la place.

import sys

def dump(obj, nested_level=0, output=sys.stdout):
    spacing = '   '
    if isinstance(obj, dict):
        print >> output, '%s{' % ((nested_level) * spacing)
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)
        print >> output, '%s}' % (nested_level * spacing)
    elif isinstance(obj, list):
        print >> output, '%s[' % ((nested_level) * spacing)
        for v in obj:
            if hasattr(v, '__iter__'):
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
        print >> output, '%s]' % ((nested_level) * spacing)
    else:
        print >> output, '%s%s' % (nested_level * spacing, obj)

En utilisant cette fonction, la sortie de l'OP ressemble à ceci:

{
   A:
   {
      color: 2
      speed: 70
   }
   B:
   {
      color: 3
      speed: 60
   }
}

ce que j’ai personnellement trouvé plus utile et plus descriptif.

Compte tenu de l'exemple légèrement moins trivial de:

{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}

La solution demandée par l'OP donne ceci:

test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)

alors que la version `` améliorée '' donne ceci:

{
   test:
   [
      {
         1: 3
      }
   ]
   test3:
   {
      (1, 2):
      [
         abc
         def
         ghi
      ]
      (4, 5): def
   }
   test2:
   [
      (1, 2)
      (3, 4)
   ]
}

J'espère que cela apportera une certaine valeur à la prochaine personne à la recherche de ce type de fonctionnalité.

MrWonderful
la source
11
Et si le format n'est pas trop strict, on peut également utiliser 'print json.dumps (obj, indent = 3)'. Cela donne une représentation raisonnable de la plupart des structures, même si cela étouffe (dans mon environnement) mon exemple moins trivial en raison de l'utilisation d'un tuple comme clé ...
MrWonderful
7
Pourquoi ne pas simplement utiliser pprint.pprint()ici alors?
Martijn Pieters
1
presque fait un créateur JSON, non?
user2007447
30

Vous avez une structure imbriquée, vous devez donc également formater le dictionnaire imbriqué:

for key, car in cars.items():
    print(key)
    for attribute, value in car.items():
        print('{} : {}'.format(attribute, value))

Cela imprime:

A
color : 2
speed : 70
B
color : 3
speed : 60
Martijn Pieters
la source
28

pprint.pprint() est un bon outil pour ce travail:

>>> import pprint
>>> cars = {'A':{'speed':70,
...         'color':2},
...         'B':{'speed':60,
...         'color':3}}
>>> pprint.pprint(cars, width=1)
{'A': {'color': 2,
       'speed': 70},
 'B': {'color': 3,
       'speed': 60}}
mac13k
la source
6
for car,info in cars.items():
    print(car)
    for key,value in info.items():
        print(key, ":", value)
Scott Olson
la source
4

Cela fonctionnera si vous savez que l'arbre n'a que deux niveaux:

for k1 in cars:
    print(k1)
    d = cars[k1]
    for k2 in d
        print(k2, ':', d[k2])
Benjamin Hodgson
la source
4

Vérifiez le one-liner suivant:

print('\n'.join("%s\n%s" % (key1,('\n'.join("%s : %r" % (key2,val2) for (key2,val2) in val1.items()))) for (key1,val1) in cars.items()))

Production:

A
speed : 70
color : 2
B
speed : 60
color : 3
Kenorb
la source
Bien, mais j'ai essayé de le convertir pour l'utiliser avec sys.modules, mais j'ai échoué. Voulez-vous essayer?
not2qubit
4

Je préfère le formatage propre de yaml:

import yaml
yaml.dump(cars)

production:

A:
  color: 2
  speed: 70
B:
  color: 3
  speed: 60
gizzmole
la source
Vous devez d' pip install PyYAMLabord.
Boris le
0
###newbie exact answer desired (Python v3):
###=================================
"""
cars = {'A':{'speed':70,
        'color':2},
        'B':{'speed':60,
        'color':3}}
"""

for keys, values in  reversed(sorted(cars.items())):
    print(keys)
    for keys,values in sorted(values.items()):
        print(keys," : ", values)

"""
Output:
B
color  :  3
speed  :  60
A
color  :  2
speed  :  70

##[Finished in 0.073s]
"""
bpr67
la source
0
# Declare and Initialize Map
map = {}

map ["New"] = 1
map ["to"] = 1
map ["Python"] = 5
map ["or"] = 2

# Print Statement
for i in map:
  print ("", i, ":", map[i])

#  New : 1
#  to : 1
#  Python : 5
#  or : 2
L'Homme lui-même
la source
0

Voici ma solution au problème. Je pense que l'approche est similaire, mais un peu plus simple que certaines des autres réponses. Il permet également un nombre arbitraire de sous-dictionnaires et semble fonctionner pour n'importe quel type de données (je l'ai même testé sur un dictionnaire qui avait des fonctions comme valeurs):

def pprint(web, level):
    for k,v in web.items():
        if isinstance(v, dict):
            print('\t'*level, f'{k}: ')
            level += 1
            pprint(v, level)
            level -= 1
        else:
            print('\t'*level, k, ": ", v)
rochesNondes
la source
-1

Modifier le code MrWonderful

import sys

def print_dictionary(obj, ident):
    if type(obj) == dict:
        for k, v in obj.items():
            sys.stdout.write(ident)
            if hasattr(v, '__iter__'):
                print k
                print_dictionary(v, ident + '  ')
            else:
                print '%s : %s' % (k, v)
    elif type(obj) == list:
        for v in obj:
            sys.stdout.write(ident)
            if hasattr(v, '__iter__'):
                print_dictionary(v, ident + '  ')
            else:
                print v
    else:
        print obj
Vlad
la source
1
Qu'avez-vous modifié? Quelle est la sortie?
Andreas Haferburg