Una soluzione più generalizzata che gestisce elenchi e elenchi nidificati in modo arbitrario sarebbe:
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
Questo produce l'output:
A
color : 2
speed : 70
B
color : 3
speed : 60
Mi sono imbattuto in un'esigenza simile e ho sviluppato una funzione più solida come esercizio per me stesso. Lo sto includendo qui nel caso in cui possa essere utile per un altro. Nell'esecuzione di nosetest, ho anche trovato utile poter specificare il flusso di output nella chiamata in modo da poter utilizzare sys.stderr.
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)
Usando questa funzione, l'output dell'OP è simile al seguente:
{
A:
{
color: 2
speed: 70
}
B:
{
color: 3
speed: 60
}
}
che ho trovato personalmente più utile e descrittivo.
Dato l'esempio leggermente meno banale di:
{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}
La soluzione richiesta dall'OP produce questo:
test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)
mentre la versione "migliorata" produce questo:
{
test:
[
{
1: 3
}
]
test3:
{
(1, 2):
[
abc
def
ghi
]
(4, 5): def
}
test2:
[
(1, 2)
(3, 4)
]
}
Spero che questo offra un valore alla prossima persona che cerca questo tipo di funzionalità.