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

我有一个字典,其中键是字符串,值是列表。

现在,在添加与给定键关联的值时,我总是必须检查是否有任何列表,否则我必须初始化为空列表,有点像下面的代码段:

      if not k in myDict:
          myDict[k] = []
      myDict[k].append(v)

我想知道是否有任何方法可以将这些步骤合并到python 3.7中的单个步骤中。


月关宝盒
浏览 95回答 2
2回答

明月笑刀无情

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

慕运维8079593

您可以使用 :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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python