默认值为 1 的 defaultdict?

defaultdict with default value 1?

我是 python 的新手,我从某个地方阅读了一些代码片段。它是计数排序的一种实现。

代码如下:

from collections import defaultdict
def sort_colors(A):
    ht = {}                        # a hash map
    ht = defaultdict(lambda:0, ht) # with default value 1
    for i in A:
         ht[i] += 1
    ret = []
    for k in [0, 1, 2]:
        ret.extend([k]*ht[k])
    return ret

与函数的前两行一样,它是

ht = {}
ht = defaultdict(lambda:0, ht)

这个我不是很清楚initialization.Could请你帮我看看?还有,我们可以用以下内容替换这两行吗?

ht = defaultdict(int) # default value 0

简答(根据下面蒙塔罗的回答)

defaultdict(lambda:1)

详细回答 defaultdict 的工作原理

ht = {}
ht = defaultdict(lambda:0, ht)

defaultdictdict 的不同之处在于,当您尝试使用不存在的密钥访问常规 dict 时,它会引发 KeyError。但是,
defaultdict 不会引发错误:它会为您创建密钥。有什么价值?使用 callable 的 return 作为参数传递。在这种情况下,每个新键都将使用值 0 创建(这是简单 lambda 函数 lambda:0 的 return),这也恰好是相同的 return 的 int() ,所以在 这种情况 中,将默认函数更改为 int().

没有区别

更详细地分解这一行:ht = defaultdict(lambda:0, ht)

第一个参数是一个函数,它是一个可调用对象。这是将被调用来为不存在的键创建新值的函数。第二个参数 ht 是可选的,它指的是新 defaultdict 将建立的基础字典。因此,如果 ht 有一些键和值,那么 defaultdict 也会有这些键和相应的值。如果您尝试访问这些键,您将获得旧值。 但是,如果您没有传递基本字典,则会创建一个全新的 defaultdict,因此,所有访问的新键都将从可调用的 return 中获得默认值。
(在这种情况下,由于 ht 最初是一个空的 dict,因此执行 ht = defaultdict(lambda:0)ht = defaultdict(int)ht = defaultdict(lambda:0, ht) 完全没有区别:它们会全部构建相同 defaultdict.

我想你可以传递一个 lambda 函数 returns 1

from collections import defaultdict

d = defaultdict(lambda: 1)

相当于@Montaro 的回答:

def a():
    return 1

d = defaultdict(a)