Zum Beispiel sollte Stock ["Verhältnisse"] ["portfolio_percent"] stile werden ["Ratios_portfolio_percent"] . Und so weiter mit allen anderen verschachtelten Werten. < /P>
außer ich möchte auch keine redundanten Schlüssel. Ich möchte nicht Wörterbuch und finden Sie den kürzesten Schlüssel für alle verschachtelten Felder, während Sie sich allen vorherigen, notwendigen Tasten anschließen. < /p>
Mein Problem ist nicht, dass ich diese Funktion nicht schreiben kann - ich habe bereits und es Funktioniert in Ordnung (empfehlen Sie gerne Optimierungen).
Code: Select all
def serialize(dictionary):
field_list = []
def fields_recursion(value, trail=[]):
for field in value:
new_trail = trail
new_value = value[field]
if type(new_value) == dict:
new_trail = new_trail + [field]
fields_recursion(new_value, new_trail)
else:
field_list.append({"field": field, "trail": new_trail})
fields_recursion(dictionary)
duplicates_found = []
field_count = {}
for item in field_list:
fid = item["field"]
if fid not in field_count:
field_count[fid] = []
field_count[fid].append(item)
for fid, items in field_count.items():
if len(items) > 1:
duplicates_found.extend(items)
while len(duplicates_found) > 0:
duplicate = duplicates_found.pop(0)
field = duplicate["field"]
trail = duplicate["trail"]
trailing = trail[-1]
new_trail = trail[:-1]
new_field = f"{trailing}_{field}"
for i, f in enumerate(field_list):
if f == duplicate:
field_list[i] = {"field": new_field, "trail": new_trail}
serialize(dictionary) # Look below for a link to an example dictionary
< /code>
(Verwenden Sie diesen JSON (oder dieses python kompatible Wörterbuch) als Beispiel dafür , mehr verwirrend) liegt in den folgenden zwei Zeilen.trailing = trail[-1]
new_trail = trail[:-1]
Code: Select all
trailing = trail.pop(-1)
new_trail = trail
Statt > Jedes Trail Array. Anstelle eines Elements im Arraywechseln von sieben do, was dazu führt, dass die folgenden Iterationen der Duplikate -Schleife fehlschlagen, da Trail zu kurz wird (Sie können nicht auf -1 zugreifen, wenn das Array leer ist). < /p>
Gibt es eine vernünftige Erklärung dafür, warum dies so funktioniert, wie es ist? Ich vermute, dass dies etwas damit zu tun hat, wie locker ein Sprachpython ist.