2013-04-03 9 views
83

ist das WörterbuchWie wird ein Wörterbuch Zeile für Zeile in Python gedruckt? Dieses

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

Mit dieser for loop

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

Er druckt die folgenden:

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

Aber ich möchte das Programm es so drucken:

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.

Antwort

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

Ausgang:

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

Ich weiß, das ist alt, aber ich dachte, es würde sich lohnen zu erwähnen, dass dies nicht funktioniert, wenn Autos [x] ganzen Zahlen ist. Es ist nicht das, was das OP angefordert hat, also sage ich es nur für jeden, der darauf stolpert, vorausgesetzt, es ist eine pauschale Lösung. –

+0

@DarrelHolt wissen Sie, wie man es mit ganzen Zahlen arbeiten lässt? Denn das ist das Problem, dem ich derzeit gegenüberstehe. – theprowler

+0

@theprowler Das nächste, was ich bekomme, um das Problem neu zu erstellen ist, wenn 'Autos = {1: 4, 2: 5}' dann 'Autos [x]' ist eine Ganzzahl zugeordnet Taste 'x' statt einer Menge, die der Taste' x' zugeordnet ist. In diesem Fall müssen Sie die Zeile "for y in cars [x]:" nicht verwenden, da nur ein Wert abgerufen wird, es sei denn, Sie verwenden so etwas wie eine Liste oder einen Satz von ganzen Zahlen, dann sollte es funktionieren . Es tut mir leid, es sind ein paar Monate vergangen, deshalb kann ich mich nicht mehr genau erinnern, wie ich zu meinem letzten Kommentar gekommen bin. Du könntest mir deinen Code schicken und ich kann sehen, ob ich irgendeine Hilfe bin. –

23

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

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

Diese Drucke:

A 
color : 2 
speed : 70 
B 
color : 3 
speed : 60 
4
for car,info in cars.items(): 
    print(car) 
    for key,value in info.items(): 
     print(key, ":", value) 
3

Das funktioniert, wenn Sie der Baum nur zwei Ebene wissen:

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

Eine allgemeinere Lösung, seien beliebig tief verschachtelte dicts und Listen behandelt:

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 den Ausgang :

Ich stieß auf eine ähnliche Notwendigkeit und entwickelte eine robustere Funktion als Übung für mich Ich schließe es hier für den Fall ein, dass 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, so dass 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 Hilfe dieser Funktion die Ausgabe sieht das OP wie folgt aus:

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

, die ich persönlich nützlicher sein und beschreibenden gefunden.

die etwas weniger triviale Beispiel Gegeben:

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

Die OP angeforderte Lösung ergibt dies:

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

während die 'erweiterte' Version Ausbeuten dieses:

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

+8

Und wenn das Format nicht übermäßig streng ist, könnte 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 ... – MrWonderful

+4

Warum nicht einfach ['pprint.pprint()' verwenden ] (https://docs.python.org/2/library/pprint.html#pprint.pprint) hier dann? –

+0

fast einen JSON-Schöpfer gemacht, nein? – user2007447

2

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

Ausgang:

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

Als Martijn Pieters in einer der Kommentare über Schön erwähnt 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}} 
43

Sie könnten dafür das Modul json verwenden. Die Funktion dumps in diesem Modul konvertiert ein JSON-Objekt in eine ordnungsgemäß formatierte Zeichenfolge, die Sie anschließend 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

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

Die documentation auch eine Reihe von nützlichen Optionen für diese Methode angibt.

+0

funktioniert nicht für "datetime" -Werte – fjardon

0

Ändern MrWonderful Code

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