有没有办法使用 dict.setdefault() 做到这一点?
当然! setdefault 没有什么神奇之处;如果存在则返回my_dict[name],如果不存在则设置my_dict[name] = default并返回default。
无论哪种方式,它返回的是my_dict[name] 中的(可能是新的)dict,所以你所要做的就是更新它:
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,也可以使用use defaultdict (as demonstrated in CoryKramer's answer)(反之亦然)。如果您希望始终采用默认行为,请使用defaultdict。如果您希望默认行为仅此一次,请仅使用 setdefault(例如,您希望在构建 dict 时默认,但您希望稍后使用 KeyErrors)。