Python字典如何在一行中创建键或更新键?

3
我的问题类似于Python dict how to create key or append an element to key? 我想要创建以下的字典嵌套字典:
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个回答

8
当然可以!使用 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(正如CoryKramer的答案中所示)(反之亦然)。如果您希望始终具有默认行为,请使用defaultdict。仅在需要默认行为的情况下使用setdefault(例如,在构建字典时需要默认值,但在使用时希望出现KeyError)。

1
以上的代码片段应该是说如果name不在my_dict中: - undefined
@crusarovid 谢谢,已修复。 - undefined

3

你可以使用 collections.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 之前将创建一个新的 dict

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接