我的问题类似于 Python dict如何创建键或将元素附加到键?
我想创建以下字典词典:
my_dict = {
"name1" : { "id1" : "pin1", "id2" : "pin2" },
"name2" : { "id3" : "pin3", "id4" : "pin4" }
}
Run Code Online (Sandbox Code Playgroud)
我目前使用以下方法完成此任务:
if name in my_dict:
my_dict[name].update({ id : pin }
else:
my_dict[name] = { id : pin }
Run Code Online (Sandbox Code Playgroud)
有没有办法使用dict.setdefault()来做到这一点?
有没有办法使用dict.setdefault()来做到这一点?
当然!没有什么神奇之处setdefault; 它只是返回my_dict[name]它,如果它存在,或设置my_dict[name] = default并返回,default如果不存在.
无论哪种方式,它返回的是(可能是新的)字典my_dict[name],所以你要做的就是更新它:
my_dict.setdefault(name, {})[id] = pin
Run Code Online (Sandbox Code Playgroud)
或者,如果您真的喜欢使用update而不仅仅是[] =:
my_dict.setdefault(name, {}).update({id: pin})
Run Code Online (Sandbox Code Playgroud)
例如:
>>> 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'}}
Run Code Online (Sandbox Code Playgroud)
更一般地说,您显然可以将现有代码重写为:
if name not in my_dict:
my_dict[name] = {}
my_dict[name].update({ id : pin }
Run Code Online (Sandbox Code Playgroud)
只要你能做到,你就可以使用setdefault.(但是请注意,我们调用不同诱变方法或分配给一个键/索引/成员的my_dict[name]这里,不只是分配一个新的价值my_dict[name].这是关键它是有用的.)
当然,几乎任何时候你都可以使用setdefault,你也可以使用defaultdict(如CoryKramer的答案所示)(反之亦然).如果你想违约行为,所有的时间,使用defaultdict.只有setdefault在你想要一次违约行为时才使用(例如,你想要在构建dict的同时进行默认,但是你想KeyError在以后使用它时).