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

时间:2018-05-03 20:48:52

标签: python dictionary

我的问题类似于 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 个答案:

答案 0 :(得分:5)

  

有没有办法用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]的键/索引/成员,而不只是为{分配新值{1}}。这是它有用的关键。)

当然,几乎任何时候你都可以使用my_dict[name],你也可以use defaultdict (as demonstrated in CoryKramer's answer)(反之亦然)。如果您希望始终使用默认行为,请使用setdefault。如果您只想使用默认行为,只需使用defaultdict (例如,您在构建字典时需要默认,但在使用它时需要setdefault。)< / p>

答案 1 :(得分: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,如果dict尚未name,则会创建一个新update在致电import openpyxl from openpyxl.styles import Font wb = openpyxl.Workbook() sheet = wb.get_sheet_by_name('Sheet') italic24Font = Font(size=24, italic=True) sheet['A1'].font = italic24Font sheet['A1'] = 'Hello world!' wb.save('styled.xlsx')

之前