Python изменяет значение вложенного словаря в списке ключей - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть словарь вроде:

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

И список ключей:

["value2", "value4"]

Как мне изменитьсловарь такой, что ключ "value4" (в словаре с ключом "value2") меняется на "value4*"?Я хочу, чтобы только последний ключ был затронут, поэтому "value2" не будет изменен.

Я пытался использовать list(map(dictionary.get, keys)), но это не делает то, что я хочу.

Заранее спасибо.

ps Я старался держать это очень коротким, пожалуйста, скажите мне, если я слишком много вырезал.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Другая опция, но другая логика.

Работает на клавишах второго уровня, изменяется только value4 непосредственно под 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)

Или в этом случае value2непосредственно под value2, а не value2 на более высоком уровне:

dct = {"value1": {}, "value2": {"value2": {}, "value4": {}, "value5": {"value4": {}}}}
keyz = ["value2", "value2"]
{'value1': {}, 'value2': {'value4': {}, 'value5': {'value4': {}}, 'value2*': {}}}
0 голосов
/ 24 февраля 2019

Вы можете использовать рекурсию:

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))   

Вывод:

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

Редактировать: без 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()}
...