Unerwartetes Verhalten beim Knacken von Objekten in PythonPython

Python-Programme
Guest
 Unerwartetes Verhalten beim Knacken von Objekten in Python

Post by Guest »

Ich versuche, mit Wörterbüchern eine ganz bestimmte Sache zu machen. Ich möchte alle verschachtelten Werte beibehalten, aber ich möchte, dass sie mit einem bestimmten Schlüssel auf der obersten Ebene sind - dieser Schlüssel sollte eine Zeichenfolge von jedem Taste sein, der vor dem Wert zugegriffen wird und mit einem Unterstrich verbunden ist. < /P>
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]
Wenn anstatt das letzte Element in Trail mit einem -1 index zu nehmen, i .pop Das Trail -Array, die Ganzes Programm bricht. Um dieses Verhalten zu replizieren, ersetzen Sie die obigen zwei Zeilen durch Folgendes.

Code: Select all

trailing = trail.pop(-1)
new_trail = trail
Obwohl der Code identisch sein sollte, wenn Sie das Trail -Array aus irgendeinem Grund platzen lassen, wird das letzte Element des Trail -Arrays für jeder Übereinstimmungselement in field_list . Der erste Unterbrecher sollte sein, wenn Feld "action" ist und der letzte Element in Trail "Wert" ist. Normalerweise sollte dies das entsprechende Element in field_list durch ein Feld von "value_action" und einem Trail ersetzen, das kürzer ist (mit dem letzten Element "Value" < /Code>, entfernt).
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post