[英]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
与 func 的前两行一样,它是
ht = {}
ht = defaultdict(lambda:0, ht)
这个初始化我不是很清楚。你能帮我弄清楚吗? 而且,我们是否应该用以下内容替换这两行?
ht = defaultdict(int) # default value 0
简短回答(根据下面蒙塔罗的回答)
defaultdict(lambda:1)
关于defaultdict
如何工作的长答案
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
s 与dict
不同之处在于,当您尝试使用不存在的键访问常规dict
时,它会引发KeyError
。
但是, defaultdict
不会引发错误:而是为您创建密钥。 用哪个值? 随着callable
的返回,您作为参数传递。 在这种情况下,每个新键都将创建为值为0
(这是简单的lambda
函数lambda:0
的返回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
。
我认为你可以只传递一个返回1
的 lambda 函数
d = defaultdict(lambda:1)
相当于@Montaro 的回答:
def a():
return 1
d = defaultdict(a)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.