python: заменить значение по ключу и вернуть словарь

стоит задача:

есть словарь node = {'T': '', 'V': 0, 'E': []}

необходимо вернуть данный словарь, но с заменённым значением по ключу E

можно сделать так:

return {'T': node['T'], 'V': node['V']: 'E': [1, 2]}

можно так:

node['E'] = [1, 2]
return node

или даже так (по идее самый надежный):

new = copy.deepcopy(node)
new ['E'] = [1, 2]
return new 

Такой вопрос - а можно ли как-нибудь красиво сделать это в 1 строчку и без уж слишком лишнего функционала, что-то подобное как в JS:

return {...node, 'E': [1, 2]}

Ответы (1 шт):

Автор решения: frrusi

Предисловие

Официальная документация Python 3 содержит раздел 'Built-in Types', в котором описываются стандартные типы данных, встроенные в интерпретатор.

В подразделе 'Mapping Types — dict' можно изучить список операций, которые поддерживают словари.

Ответ

Одним из нововведений в Python 3.9 выступает merge operator для встроенного dict-класса.

Официальная документация гласит:

d | other

Create a new dictionary with the merged keys and values of d and other, which must both be dictionaries. The values of other take priority when d and other share keys.

New in version 3.9.

Т. е. результатом будет выступать новый словарь с объединенными ключами и значениями из словарей d и other. Значения словаря other будут в приоритете в случае коллизии ключей.

Пример

>>> d = {'spam':  1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}

>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}

>>> e | d
{'cheese': 3, 'aardvark': 'Ethel', 'spam': 1, 'eggs': 2}

Примечание

В случае возникновения каких-либо вопросов, обратитесь к PEP 584 – Add Union Operators To dict

→ Ссылка