Python 默认值为1的defaultdict?

Python 默认值为1的defaultdict?,python,defaultdict,Python,Defaultdict,我是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 =

我是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
与func的前两行一样,它是

ht = {}
ht = defaultdict(lambda:0, ht)
我不太清楚这个初始化。你能帮我弄清楚吗?还有,我们用下面的代码来替换这两行吗

ht = defaultdict(int) # default value 0
简短回答(根据下面蒙塔罗的回答)


关于
defaultdict
s如何工作的详细答案

ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
s与
dict
的不同之处在于,当您尝试使用不存在的密钥访问常规
dict
时,它会引发
KeyError

defaultdict
,但不会引发错误:而是为您创建密钥。有什么价值?返回作为参数传递的
callable
。在这种情况下,每个新键都将使用值
0
(这是简单
lambda
函数
lambda:0
的返回),这也恰好是
int()
的相同返回,因此在这种情况下,将默认函数更改为
int()

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

第一个参数是一个函数,它是一个可调用的对象。这是将被调用的函数,用于为不存在的键创建新值。第二个参数,
ht
是可选的,它引用了新的
defaultdict
将基于的基本字典。因此,如果
ht
有一些键和值,那么
defaultdict
也会有这些键和相应的值。如果您试图访问这些键,您将获得旧值。 但是,如果您没有通过基本字典,则会创建一个全新的
defaultdict
,因此,访问的所有新键都会从可调用项返回默认值。

(在这种情况下,由于
ht
最初是一个空的
dict
,执行
ht=defaultdict(lambda:0)
ht=defaultdict(int)
ht=defaultdict(lambda:0,ht)没有任何区别。)
:它们都将构建相同的
defaultdict

我认为您可以传递一个lambda函数,该函数返回
1

d = defaultdict(lambda:1)

相当于@Montaro的答案:

def a():
    return 1

d = defaultdict(a)

只要您是从集合导入,最好只使用一个
计数器
。那里的默认值不是1,而是0。尝试
ht=defaultdict(lambda:1)#使用默认值1
并删除前面的
ht={}
,因为您在下一行中更改了
ht
的值,所以它没有任何作用。(lambda:0,ht)只是可以用0调用?这是正确的。我编辑了这篇文章,对其进行了更详细的分解,谢谢你的回答。你知道如何使常量始终不同吗?我解释:
defaultdict(lambda:'string',ht)
将无法按预期工作,因为所有新密钥将共享相同的
'string'
实例。如何每次提供一个副本?请注意
defaultdict(lambda:copy.copy('string'),ht)
不起作用,因为
copy
只计算一次。@Dr_Zaszuś抱歉,但我不理解您的示例。字符串是不可变的,有些是内部的,所以即使您执行
x=“some string”
b=copy.copy(x)
,您仍然可以发现
x是b==True
。因此,在这种情况下,是否使用
copy
并不重要。您能进一步解释一下吗?
def a():
    return 1

d = defaultdict(a)