我已经阅读了 python 文档中的示例,但仍然无法弄清楚这种方法的含义。有人可以帮忙吗?这是python文档中的两个示例
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
和
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
参数int
和list
是为了什么?
通常,KeyError
如果你尝试使用当前不在字典中的键来获取项目,则Python 字典会抛出 a 。该defaultdict
相反只会创建你尝试访问的任何物品(当然前提是他们还不存在)。要创建这样的“默认”项,它会调用你传递给构造函数的函数对象(更准确地说,它是一个任意的“可调用”对象,其中包括函数和类型对象)。对于第一个示例,默认项是使用 创建的int()
,它将返回整数对象0
。对于第二个示例,使用 来创建默认项list()
,它返回一个新的空列表对象。
它在功能上是否与使用 d.get(key, default_val) 不同?
@Ambareesh
d.get(key, default)
永远不会修改你的字典——它只会返回默认值并保持字典不变。defaultdict
,另一方面,将在字典中插入一个键(如果它还没有)。这是一个很大的不同;请参阅问题中的示例以了解原因。我们如何知道每种类型的默认值是多少?0 表示 int() 和 [] 表示 list() 是直观的,但也可以有更复杂或自定义的类型。
@Sean
defaultdict
调用您传入的任何构造函数。如果传入 a 类型T
,值将使用T()
. 并非所有类型都可以在不传入任何参数的情况下构造。如果要构造这样的类型,则需要一个包装函数,或类似functools.partial(T, arg1, arg2)
.或者更简单:一个 lambda。
defaultdict(lambda : T(arg1, arg2))
.