【问题标题】:Python dict how to create key or update key in one line?Python dict如何在一行中创建密钥或更新密钥?
【发布时间】:2018-05-03 20:48:52
【问题描述】:

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

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    有没有办法使用 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)。

    【讨论】:

    • 上面的代码 sn-p 应该说 if name not in my_dict:
    • @crusarovid 谢谢;固定。
    【解决方案2】:

    您可以使用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之前创建一个新的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      相关资源
      最近更新 更多