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à.
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. –
@DarrelHolt sai come farlo funzionare con gli interi? Perché questo è il problema che sto attualmente affrontando – theprowler
@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. –