Bardziej uogólnionym rozwiązaniem, które obsługuje dowolnie głęboko zagnieżdżone dykty i listy, byłoby:
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
To daje wynik:
A
color : 2
speed : 70
B
color : 3
speed : 60
Wpadłem na podobną potrzebę i rozwinąłem bardziej solidną funkcję jako ćwiczenie dla siebie. Dołączam go tutaj na wypadek, gdyby miał znaczenie dla innego. Podczas uruchamiania programu nosetest okazało się również pomocne, aby móc określić strumień wyjściowy w wywołaniu, aby zamiast tego można było użyć 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)
Korzystając z tej funkcji, wyjście OP wygląda następująco:
{
A:
{
color: 2
speed: 70
}
B:
{
color: 3
speed: 60
}
}
które osobiście uważam za bardziej przydatne i opisowe.
Biorąc pod uwagę nieco mniej trywialny przykład:
{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}
Żądane rozwiązanie OP daje to:
test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)
mając na uwadze, że wersja `` ulepszona '' daje to:
{
test:
[
{
1: 3
}
]
test3:
{
(1, 2):
[
abc
def
ghi
]
(4, 5): def
}
test2:
[
(1, 2)
(3, 4)
]
}
Mam nadzieję, że zapewni to pewną wartość następnej osobie szukającej tego typu funkcjonalności.