it-swarm.com.de

Wie drucke ich ein Wörterbuch zeilenweise in Python?

Dies ist das Wörterbuch

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

Verwendung dieses for loop

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

Es druckt Folgendes:

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

Aber ich möchte, dass das Programm es so druckt:

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

Ich habe gerade angefangen, Wörterbücher zu lernen, also bin ich mir nicht sicher, wie ich das machen soll.

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

ausgabe:

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

Eine allgemeinere Lösung, die mit beliebig tief verschachtelten Diktaten und Listen umgehen kann, wäre:

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

Dies erzeugt die Ausgabe:

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

Ich hatte ein ähnliches Bedürfnis und entwickelte eine robustere Funktion als Übung für mich. Ich füge es hier ein, falls es für einen anderen von Wert sein kann. Beim Ausführen von nosetest war es auch hilfreich, den Ausgabestrom im Aufruf angeben zu können, sodass stattdessen sys.stderr verwendet werden konnte.

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)

Mit dieser Funktion sieht die Ausgabe des OP folgendermaßen aus:

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

was ich persönlich nützlicher und beschreibender fand. 

Angesichts des etwas weniger trivialen Beispiels von:

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

Die vom OP geforderte Lösung führt dazu:

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

während die "verbesserte" Version dies ergibt:

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

Ich hoffe, dass dies der nächsten Person, die nach dieser Art von Funktionalität sucht, einen gewissen Wert bietet.

78
MrWonderful

Sie können dazu das Modul json verwenden. Die Funktion dumps in diesem Modul konvertiert ein JSON-Objekt in eine ordnungsgemäß formatierte Zeichenfolge, die Sie dann drucken können.

import json

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

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

Die Ausgabe sieht so aus

{
 "EIN": {
 "Farbe": 2, 
 "Geschwindigkeit": 70 
 }, 
 "B": {
 "Farbe": 3, 
 "Geschwindigkeit": 60 
 } 
} 

Die documentation gibt auch eine Reihe nützlicher Optionen für diese Methode an.

74
kchak

Sie haben eine verschachtelte Struktur, daher müssen Sie auch das verschachtelte Wörterbuch formatieren:

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

Dies druckt:

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

Wie Martijn Pieters in einem der obigen Kommentare erwähnt hat, ist PrettyPrint ein gutes Werkzeug für diesen Job:

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

Dies funktioniert, wenn Sie wissen, dass der Baum nur zwei Ebenen hat:

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

Überprüfen Sie den folgenden Einliner:

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

Ausgabe:

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