Unerwartetes Verhalten beim Knacken von Objekten in Python

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Unerwartetes Verhalten beim Knacken von Objekten in Python

by Guest » 18 Feb 2025, 13:36

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.

Top