Mam słownik taki jak:

{"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value6": {}}}}

I lista kluczy:

["value2", "value4"]

Jak mogę zmodyfikować słownik taki, że klucz "value4" (w słowniku z kluczem "value2") zmienia się na "value4*"? Chcę tylko ostatnim kluczu, więc "value2" nie zostanie zmieniona.

Próbowałem użyć list(map(dictionary.get, keys)), ale to nie robi tego, czego chcę.

Z góry dziękuję.

Str.s. Próbowałem utrzymać to bardzo krótko, powiedz mi, czy wycięłem za dużo.

2
Jachdich 24 luty 2019, 19:24

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć rekurencji:

new_d = ["value2", "value4"]
d = {"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value6": {}}}}
def update(data):
  return {a if a != new_d[-1] else f'{a}*':b if not isinstance(b, dict) else update(b) for a, b in data.items()}

print(update(d))   

Wynik:

{'value1': {}, 'value2': {'value3': {}, 'value4*': {}, 'value5': {'value6': {}}}}

Edytuj: bez f-string:

def update(data):
  return {a if a != new_d[-1] else a+"*":b if not isinstance(b, dict) else update(b) for a, b in data.items()}
2
Ajax1234 24 luty 2019, 16:39

Inna opcja, ale inna logika.

Działa na przyciskach drugiego poziomu, zmienia tylko value4 bezpośrednio pod value2:

dct = {"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value4": {}}}}
keyz = ["value2", "value4"]

print(dct)

def append_star(dct, keyz):
  dct[keyz[0]][keyz[1] + '*'] = dct[keyz[0]][keyz[1]]
  del dct[keyz[0]][keyz[1]]

append_star(dct, keyz)

Lub w tym przypadku, value2 bezpośrednio pod value2, a nie value2 na wyższym poziomie:

dct = {"value1": {}, "value2": {"value2": {}, "value4": {}, "value5": {"value4": {}}}}
keyz = ["value2", "value2"]
{'value1': {}, 'value2': {'value4': {}, 'value5': {'value4': {}}, 'value2*': {}}}
0
iGian 24 luty 2019, 17:01