为了账号安全,请及时绑定邮箱和手机立即绑定

在Python 3.7中一步初始化并添加字典中的列表

在Python 3.7中一步初始化并添加字典中的列表

月关宝盒 2022-09-13 10:01:14
我有一个字典,其中键是字符串,值是列表。现在,在添加与给定键关联的值时,我总是必须检查是否有任何列表,否则我必须初始化为空列表,有点像下面的代码段:      if not k in myDict:           myDict[k] = []       myDict[k].append(v)我想知道是否有任何方法可以将这些步骤合并到python 3.7中的单个步骤中。
查看完整描述

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'

>>>


查看完整回答
反对 回复 2022-09-13
?
慕运维8079593

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


查看完整回答
反对 回复 2022-09-13
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信