Есть ли способ сделать это с помощью 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
позже при его использовании).