Wie drucke ich ein Wörterbuch Zeile für Zeile in Python?

166

Dies ist das Wörterbuch

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

Verwenden Sie dies for loop

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

Es wird Folgendes gedruckt:

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, daher bin ich mir nicht sicher, wie ich das machen soll.

Jett
quelle

Antworten:

142
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
namit
quelle
12
Ich weiß, dass dies alt ist, aber ich dachte, es wäre erwähnenswert, dass dies nicht funktioniert, wenn Autos [x] ganze Zahlen sind. Es ist nicht das, was das OP verlangt hat, also sage ich es nur für jeden, der darauf stößt, vorausgesetzt, es ist eine pauschale Lösung.
Darrel Holt
@DarrelHolt Weißt du, wie es mit ganzen Zahlen funktioniert? Weil das das Problem ist, mit dem ich gerade konfrontiert bin
theprowler
@theprowler Ich kann das Problem am ehesten neu erstellen, wenn cars = {1:4, 2:5}dann cars[x]eine Ganzzahl dem Schlüssel zugeordnet ist xund keine Menge dem Schlüssel zugeordnet ist x. In diesem Fall müssen Sie die for y in cars[x]:Zeile nicht verwenden , da Sie nur einen Wert abrufen, es sei denn, Sie verwenden eine Liste oder einen Satz von Ganzzahlen, dann sollte es funktionieren. Entschuldigung, es sind einige Monate vergangen, daher kann ich mich nicht vollständig erinnern, wie ich zu dem Schluss meines vorherigen Kommentars gekommen bin. Sie könnten mir Ihren Code schicken und ich kann sehen, ob ich Hilfe brauche.
Darrel Holt
Hmm. Ich denke, mein Problem ist noch schlimmer. Grundsätzlich habe ich einige Daten aus einer HTML-Tabelle analysiert und sie zufällig in einem Wörterbuch gespeichert. Jetzt versuche ich, diese Wörterbuchdaten in einen DataFrame zu kopieren, bevor ich sie alle in eine Oracle-Tabelle exportiere. ... es ist ziemlich ausführlich, ich weiß, aber der Schritt, der mich gerade aufhält, ist das Einfügen der Daten in einen DataFrame ... mein Wörterbuch hat aus irgendeinem Grund einen Schlüssel und alle Daten sind in Werten, daher ist es schwierig versuchen, es ordentlich in Zeilen und Spalten zu setzen ..
Theprowler
118

Sie können das jsonModul dafür verwenden. Die dumpsFunktion 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 aus wie

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

In der Dokumentation werden auch einige nützliche Optionen für diese Methode angegeben.

kchak
quelle
2
Zwar muss der Inhalt des Diktats in json serialisierbar sein, die hier bereitgestellte Ausgabe ist jedoch weitaus sauberer (z. B. für Menschen lesbar) als die vom pprint.PrettyPrinter erzeugte Ausgabe. speziell im Bereich des konsistenten Einrückens und Verwerfens von String-Präfixen wie u'foo '.
Buffalo Rabor
Ich mache das, print(json.dumps(cars, indent=4, ensure_ascii=False))weil sonst Nicht-ASCII-Zeichen nicht lesbar sind.
Boris
85

Eine allgemeinere Lösung, die willkürlich tief verschachtelte Dikte und Listen behandelt, wäre:

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

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 fand ich es auch hilfreich, den Ausgabestream im Aufruf angeben zu können, damit stattdessen sys.stderr verwendet werden kann.

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)

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 als nützlicher und beschreibender empfand.

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 angeforderte Lösung ergibt Folgendes:

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

wohingegen die "erweiterte" Version dies ergibt:

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

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

MrWonderful
quelle
11
Und wenn das Format nicht zu streng ist, kann man auch 'print json.dumps (obj, indent = 3)' verwenden. Das gibt eine vernünftige Darstellung der meisten Strukturen, obwohl es (in meiner Umgebung) an meinem weniger trivialen Beispiel aufgrund der Verwendung eines Tupels als Schlüssel
erstickt
7
Warum nicht einfach pprint.pprint()hier verwenden?
Martijn Pieters
1
fast einen JSON-Schöpfer gemacht, nein?
user2007447
30

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

pprint.pprint() ist 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}}
mac13k
quelle
6
for car,info in cars.items():
    print(car)
    for key,value in info.items():
        print(key, ":", value)
Scott Olson
quelle
4

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

Überprüfen Sie den folgenden Einzeiler:

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
Kenorb
quelle
Schön, aber ich habe versucht, es zu konvertieren, um es mit zu verwenden sys.modules, aber ich bin gescheitert. Willst du es versuchen?
not2qubit
4

Ich bevorzuge die saubere Formatierung von yaml:

import yaml
yaml.dump(cars)

Ausgabe:

A:
  color: 2
  speed: 70
B:
  color: 3
  speed: 60
Gizzmole
quelle
Du musst pip install PyYAMLzuerst.
Boris
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
quelle
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
Der Mann selbst
quelle
0

Hier ist meine Lösung für das Problem. Ich denke, es ist ähnlich, aber ein bisschen einfacher als einige der anderen Antworten. Es erlaubt auch eine beliebige Anzahl von Unterwörterbüchern und scheint für jeden Datentyp zu funktionieren (ich habe es sogar an einem Wörterbuch getestet, das als Werte fungiert):

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)
RocksNwaves
quelle
-1

MrWonderful-Code ändern

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
quelle
1
Was hast du geändert? Was ist die Ausgabe?
Andreas Haferburg