web-dev-qa-db-fra.com

Comment imprimer un dictionnaire ligne par ligne en Python?

C'est le dictionnaire

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

Utiliser ce 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

J'ai juste commencé à apprendre les dictionnaires, alors je ne sais pas comment faire.

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

sortie:

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

Une solution plus généralisée prenant en charge les dict et les listes imbriqués de manière arbitraire-profonde serait la suivante:

def dumpclean(obj):
    if type(obj) == dict:
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print k
                dumpclean(v)
            else:
                print '%s : %s' % (k, v)
    Elif type(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 développé une fonction plus robuste en tant qu'exercice pour moi-même. Je l'inclue 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 type(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 type(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
   }
}

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

Étant donné 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 le PO 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 de la valeur à la prochaine personne à la recherche de ce type de fonctionnalité.

78
MrWonderful

Vous pouvez utiliser le module json pour cela. La fonction dumps 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 de nombreuses options utiles pour cette méthode.

74
kchak

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
28
Martijn Pieters

Comme l'a mentionné Martijn Pieters dans l'un des commentaires ci-dessus, PrettyPrint 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}}
17
mac13k
for car,info in cars.items():
    print(car)
    for key,value in info.items():
        print(key, ":", value)
6
Scott Olson

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])
4
Benjamin Hodgson

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()))

Sortie:

A
speed : 70
color : 2
B
speed : 60
color : 3
3
kenorb
# 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
0
TheManHimself
###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]
"""
0
bpr67