2013-04-03 18 views
83

Questo è il dizionarioCome stampare un dizionario riga per riga in Python?

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

Usando questo for loop

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

Esso stampa il seguente:

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

Ma io voglio il programma per stampare in questo modo:

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

Ho appena iniziato ad imparare i dizionari quindi non sono sicuro di come farlo.

risposta

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

uscita:

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

So che questo è vecchio, ma ho pensato che sarebbe stato la pena ricordare che questo non funziona se le macchine [x] è interi. Non è quello che l'OP stava richiedendo, quindi lo sto solo dicendo a chiunque si imbatta in questo assumendo che si tratti di una soluzione generale. –

+0

@DarrelHolt sai come farlo funzionare con gli interi? Perché questo è il problema che sto attualmente affrontando – theprowler

+0

@theprowler Il più vicino che riesco a ricreare il problema è se 'cars = {1: 4, 2: 5}' quindi 'cars [x]' è un intero mappato al chiave 'x' piuttosto che un insieme mappato alla chiave' x'. In questo caso, non è necessario usare 'per y in cars [x]:' line perché c'è un solo valore che stai recuperando, a meno che tu non stia usando qualcosa come una lista o un insieme di numeri interi, quindi dovrebbe funzionare . Scusa, sono passati alcuni mesi, quindi non ricordo completamente come sono arrivato alla conclusione del mio precedente commento. Potresti mandarmi il tuo codice e posso vedere se sono d'aiuto. –

23

Si hanno una struttura annidata, quindi è necessario formattare il dizionario nidificato troppo:

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

Questo stampa:

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

Ciò funzionerà se si conosce l'albero ha solo due livelli:

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

Una soluzione più generale che gestisce arbitrariamente-profondamente dicts nidificati e liste sarebbe:

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 

Questo produce l'output :

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

Mi sono imbattuto in un bisogno simile e ho sviluppato una funzione più robusta come esercizio per me stesso. Lo includo qui nel caso in cui possa avere un valore per un altro. Nell'esecuzione di nosetest, ho anche trovato utile poter specificare il flusso di output nella chiamata in modo che fosse possibile utilizzare sys.stderr.

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) 

Con questa funzione, l'uscita del PO si presenta così:

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

che personalmente ho trovato più utile e descrittivo.

Dato l'esempio un po 'meno banale di:

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

soluzione richiesta dal PO cede questo:

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

mentre i 'rafforzata' versione rendimenti questo:

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

Spero che questo fornisca un certo valore alla prossima persona che cerca questo tipo di funzionalità.

+8

E se il formato non è eccessivamente rigido, si potrebbe anche usare 'print json.dumps (obj, indent = 3)'. Ciò fornisce una rappresentazione ragionevole della maggior parte delle strutture, anche se soffoca (nel mio ambiente) il mio esempio meno banale a causa dell'uso di una tupla come chiave ... – MrWonderful

+4

Perché non usare solo ['pprint.pprint()' ] (https://docs.python.org/2/library/pprint.html#pprint.pprint) qui allora? –

+0

quasi fatto un creatore JSON, no? – user2007447

2

Controllare il seguente one-liner:

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

uscita:

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

Come Martijn Pieters menzionato in una delle osservazioni di cui sopra PrettyPrint è un buon strumento per questo lavoro:

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

Per questo è possibile utilizzare il modulo json. La funzione dumps in questo modulo converte un oggetto JSON in una stringa formattata correttamente che è possibile stampare.

import json 

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

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

L'uscita sembra

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

Il documentation specifica anche una serie di opzioni utili per questo metodo.

+0

non funziona per i valori 'datetime' – fjardon

0

Modifica codice 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 
Problemi correlati