2 回答
TA贡献1828条经验 获得超4个赞
至少有三种方法:
用dict.setdefault
>>> data = {}
>>> data.setdefault('foo', []).append(42)
>>> data
{'foo': [42]}
使用 ,这与 不同,它采用可调用:defaultdict.setdefault
>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> data
defaultdict(<class 'list'>, {})
>>> data['foo'].append(42)
>>> data
defaultdict(<class 'list'>, {'foo': [42]})
最后,子类和实现:dict__missing__
>>> class MyDict(dict):
... def __missing__(self, key):
... self[key] = value = []
... return value
...
>>> data = MyDict()
>>> data['foo'].append(42)
>>> data
{'foo': [42]}
请注意,您可以将最后一个视为最灵活的密钥,您可以访问处理它时缺少的实际密钥。 是一个类工厂,它也生成一个 子类。但是,可调用的没有传递任何参数,但是,它足以满足大多数需求。defaultdictdict
此外,请注意,and 方法将保留默认行为,这在创建数据结构后可能是不可取的,您可能想要通常,或者至少,您不想再添加键。defaultdict__missing__KeyErrormydict[key]
在这两种情况下,您都可以从字典子类创建常规字典,例如.这通常应该非常快,即使对于大型物体也是如此,特别是如果它是一次性成本。对于 ,您还可以将 设置为 ,旧行为将返回:dict(data)dictdefaultdictdefault_factoryNone
>>> data = defaultdict(list)
>>> data
defaultdict(<class 'list'>, {})
>>> data['foo']
[]
>>> data['bar']
[]
>>> data
defaultdict(<class 'list'>, {'foo': [], 'bar': []})
>>> data.default_factory = None
>>> data['baz']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'baz'
>>>
TA贡献1876条经验 获得超5个赞
您可以使用 :dict.setdefault
>>> d = {}
>>> d.setdefault('k', []).append(1)
>>> d
{'k': [1]}
>>> d.setdefault('k', []).append(2)
>>> d
{'k': [1, 2]}
关于字典中method_descriptor的帮助:
dict.setdefault = setdefault(...)D.setdefault(k[,d]) -> D.get(k,d),如果 k 不在 D 中,也设置 D[k]=d
添加回答
举报