Python диктует, как создать ключ или обновить ключ в одну строку? - PullRequest
0 голосов
/ 03 мая 2018

Мой вопрос похож на Python диктует, как создать ключ или добавить элемент к ключу?

Я хочу создать следующий словарь словарей:

my_dict = {
 "name1" : { "id1" : "pin1", "id2" : "pin2" },
 "name2" : { "id3" : "pin3", "id4" : "pin4" }
}

В настоящее время я выполняю это, используя следующее:

if name in my_dict:
    my_dict[name].update({ id : pin }
else:
    my_dict[name] = { id : pin }

Есть ли способ сделать это с помощью dict.setdefault ()?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Есть ли способ сделать это с помощью dict.setdefault ()?

Конечно! В setdefault нет ничего волшебного; он просто возвращает my_dict[name], если он существует, или устанавливает my_dict[name] = default и возвращает default, если нет.

В любом случае, он возвращает (потенциально новый) диктат в my_dict[name], поэтому все, что вам нужно сделать, это обновить его:

my_dict.setdefault(name, {})[id] = pin

Или, если вам действительно нравится использовать update вместо [] =:

my_dict.setdefault(name, {}).update({id: pin})

Например:

>>> my_dict.setdefault('name1', {})['id10']= 'pin10'
>>> my_dict.setdefault('name3', {})['id20']= 'pin20'
{'name1': {'id1': 'pin1', 'id10': 'pin10', 'id2': 'pin2'},
 'name2': {'id3': 'pin3', 'id4': 'pin4'},
 'name3': {'id20': 'pin20'}}

В более общем смысле вы, очевидно, могли бы переписать существующий код так:

if name not in my_dict:
    my_dict[name] = {}
my_dict[name].update({ id : pin }

Всякий раз, когда вы можете это сделать, вы можете использовать setdefault. (Но обратите внимание, что мы вызываем мутирующий метод или , назначая здесь ключ / индекс / элемент из my_dict[name], а не просто присваиваем новое значение my_dict[name]. ключ к тому, чтобы быть полезным.)


Конечно, почти каждый раз, когда вы можете использовать setdefault, вы также можете использовать defaultdict (как показано в ответе КориКрамера) (и наоборот). Если вы хотите использовать по умолчанию все время , используйте defaultdict. Используйте setdefault только в том случае, если вы хотите использовать поведение по умолчанию только один раз (например, вы хотите установить значение по умолчанию при создании диктанта, но вы хотите KeyError позже при его использовании).

0 голосов
/ 03 мая 2018

Вы можете использовать collection.defaultdict

>>> from collections import defaultdict
>>> my_dict = defaultdict(dict)
>>> my_dict
defaultdict(<class 'dict'>, {})
>>> my_dict['name1'].update({'id1': 'pin1'})
>>> my_dict
defaultdict(<class 'dict'>, {'name1': {'id1': 'pin1'}})

Тогда вам не нужен оператор if, вы можете напрямую вызвать update, и если для этого name не существует dict, то перед вызовом update

будет создан новый.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...