繁体   English   中英

defaultdict 的默认值是 1?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM