Bardziej uogólnione rozwiązanie, które obsługuje arbitralnie-głęboko zagnieżdżone dicts i wykazy byłoby:
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
To daje wyjście :
A
color : 2
speed : 70
B
color : 3
speed : 60
Wpadłem na podobną potrzebę i rozwinąłem silniejszą funkcję jako ćwiczenie dla siebie. Załączam go tutaj, na wypadek, gdyby mógł być wartościowy dla drugiego. Podczas testu nosa znalazłem również pomocne, aby móc określić strumień wyjściowy w wywołaniu, aby zamiast tego użyć 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)
Za pomocą tej funkcji wyjście op wygląda tak:
{
A:
{
color: 2
speed: 70
}
B:
{
color: 3
speed: 60
}
}
które ja osobiście uważam za bardziej użyteczne i opisowe.
względu na nieco mniej trywialne przykład:
{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}
o ROZWIĄZANIE OP daje to:
test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)
natomiast Podwyższona wydajnością wersji ta:
{
test:
[
{
1: 3
}
]
test3:
{
(1, 2):
[
abc
def
ghi
]
(4, 5): def
}
test2:
[
(1, 2)
(3, 4)
]
}
Mam nadzieję, że zapewnia to wartość następnej osobie poszukującej tego typu funkcji.
wiem, że to jest stary, ale pomyślałem, że warto byłoby wspomnieć, że to nie zadziała, jeżeli samochody [x] jest całkowitymi. To nie jest to, o co prosił OP, więc mówię to tylko dla każdego, kto natknie się na to przy założeniu, że jest to rozwiązanie powszechne. –
@DarrelHolt Czy wiesz, jak sprawić, aby działało z liczbami całkowitymi? Ponieważ to jest problem, z którym obecnie borykam się przy patrzeniu: – theprowler
@ theprowler Najbliżej mogę odtworzyć problem, jeśli 'cars = {1: 4, 2: 5}' wtedy 'cars [x]' jest liczbą całkowitą odwzorowaną na klawisz 'x' zamiast zestawu zmapowany na klucz' x'. W tym przypadku nie musisz używać linii 'dla y in cars [x]: ', ponieważ istnieje tylko jedna wartość, którą pobierasz, chyba że używasz czegoś takiego jak lista lub zestaw liczb całkowitych, to powinno działać . Niestety, minęło kilka miesięcy, więc nie pamiętam dokładnie, jak doszedłem do wniosku z poprzedniego komentarza. Możesz wysłać mi swój kod i mogę zobaczyć, czy mogę ci pomóc. –