Python如何在一行中创建密钥或更新密钥?

cru*_*vid 0 python dictionary

我的问题类似于 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()来做到这一点?

aba*_*ert 5

有没有办法使用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在以后使用它时).