Für einige Nachbearbeitung, ich brauche wie dieseeine verschachtelte dict Struktur in einem Datensatz
{'foo': {
'cat': {'name': 'Hodor', 'age': 7},
'dog': {'name': 'Mordor', 'age': 5}},
'bar': { 'rat': {'name': 'Izidor', 'age': 3}}
}
in diesem Datensatz eine Struktur zu glätten:
[{'foobar': 'foo', 'animal': 'dog', 'name': 'Mordor', 'age': 5},
{'foobar': 'foo', 'animal': 'cat', 'name': 'Hodor', 'age': 7},
{'foobar': 'bar', 'animal': 'rat', 'name': 'Izidor', 'age': 3}]
Also schrieb ich diese Funktion:
Ich war nicht wirklich zufrieden, weil ich copy.copy
verwenden muss, um meine Eingänge zu schützen. Bei der Verwendung von flatten
möchte man natürlich nicht, dass die Eingänge geändert werden.
Dann habe ich über eine Alternative nachgedacht, die mehr globale Variablen verwendet (zumindest global zu flatten
) und einen Index anstelle von primary_keys
zu visit
direkt verwendet. Allerdings bedeutet dies nicht wirklich mir helfen, loszuwerden, die hässlichen ursprüngliche Kopie zu erhalten:
keys = copy.copy(primary_keys)
keys.reverse()
So, hier ist meine letzte Version:
def flatten(data, keys):
data = copy.copy(data)
keys = copy.copy(keys)
keys.reverse()
out = []
values = {}
def visit(node, id):
if id:
id -= 1
for key, child in node.iteritems():
values[keys[id]] = key
visit(child, id)
else:
node.update(values)
out.append(node)
visit(data, len(keys))
return out
Gibt es eine bessere Implementierung (das kann die Verwendung von vermeiden copy.copy
)?
Ihre Lösung funktioniert mit meiner Probe, aber nicht mit meinen realen Daten, die viel mehr Schichten haben. Ich brauche hier einen rekursiven Algorithmus. – nowox