Eine allgemeinere Lösung, seien beliebig tief verschachtelte dicts und Listen behandelt:
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
Dies erzeugt den Ausgang :
Ich stieß auf eine ähnliche Notwendigkeit und entwickelte eine robustere Funktion als Übung für mich Ich schließe es hier für den Fall ein, dass es für einen anderen von Wert sein kann. Beim Ausführen von nosetest fand ich es auch hilfreich, den Ausgabestream im Aufruf angeben zu können, so dass stattdessen sys.stderr verwendet werden konnte.
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)
Mit Hilfe dieser Funktion die Ausgabe sieht das OP wie folgt aus:
{
A:
{
color: 2
speed: 70
}
B:
{
color: 3
speed: 60
}
}
, die ich persönlich nützlicher sein und beschreibenden gefunden.
die etwas weniger triviale Beispiel Gegeben:
{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}
Die OP angeforderte Lösung ergibt dies:
test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)
während die 'erweiterte' Version Ausbeuten dieses:
{
test:
[
{
1: 3
}
]
test3:
{
(1, 2):
[
abc
def
ghi
]
(4, 5): def
}
test2:
[
(1, 2)
(3, 4)
]
}
Ich hoffe, dass dies der nächsten Person, die nach dieser Art von Funktionalität sucht, einen gewissen Wert bietet.
Ich weiß, das ist alt, aber ich dachte, es würde sich lohnen zu erwähnen, dass dies nicht funktioniert, wenn Autos [x] ganzen Zahlen ist. Es ist nicht das, was das OP angefordert hat, also sage ich es nur für jeden, der darauf stolpert, vorausgesetzt, es ist eine pauschale Lösung. –
@DarrelHolt wissen Sie, wie man es mit ganzen Zahlen arbeiten lässt? Denn das ist das Problem, dem ich derzeit gegenüberstehe. – theprowler
@theprowler Das nächste, was ich bekomme, um das Problem neu zu erstellen ist, wenn 'Autos = {1: 4, 2: 5}' dann 'Autos [x]' ist eine Ganzzahl zugeordnet Taste 'x' statt einer Menge, die der Taste' x' zugeordnet ist. In diesem Fall müssen Sie die Zeile "for y in cars [x]:" nicht verwenden, da nur ein Wert abgerufen wird, es sei denn, Sie verwenden so etwas wie eine Liste oder einen Satz von ganzen Zahlen, dann sollte es funktionieren . Es tut mir leid, es sind ein paar Monate vergangen, deshalb kann ich mich nicht mehr genau erinnern, wie ich zu meinem letzten Kommentar gekommen bin. Du könntest mir deinen Code schicken und ich kann sehen, ob ich irgendeine Hilfe bin. –