defaultdict,默认值为1?

cha*_*yWu 32 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 = []
    for k in [0, 1, 2]:
        ret.extend([k]*ht[k])
    return ret
Run Code Online (Sandbox Code Playgroud)

就像在func的前两行中一样

ht = {}
ht = defaultdict(lambda:0, ht)
Run Code Online (Sandbox Code Playgroud)

关于这个初始化我不是很清楚.你能不能帮我解决一下?还有,我们只需用以下内容替换这两行吗?

ht = defaultdict(int) # default value 0
Run Code Online (Sandbox Code Playgroud)

raf*_*elc 39

简短回答(根据Montaro的答案如下)

defaultdict(lambda:1)
Run Code Online (Sandbox Code Playgroud)

关于如何defaultdict工作的长篇答案

ht = {}
ht = defaultdict(lambda:0, ht)
Run Code Online (Sandbox Code Playgroud)

defaultdicts不同之处dict在于,当您尝试使用dict不存在的键访问常规时,它会引发一个KeyError.
defaultdict但是,不会引发错误:它会为您创建密钥.有哪些价值?随着callabe你的回归作为一个参数传递.在这种情况下,每个新键都将使用值0(这是简单lambda函数的返回lambda:0)创建,这也恰好是相同的返回值int(),因此在这种情况下,将默认函数更改为没有区别int().

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

第一个参数是一个函数,它是一个可调用的对象.这是将被调用以为不存在的键创建新值的函数.第二个参数ht是可选的,指的是defaultdict将构建new的基本字典.因此,如果ht有一些键和值,defaultdict那么这些键也会具有相应的值.如果您尝试访问这些密钥,则会获得旧值.但是,如果您没有传递基本字典,defaultdict则会创建一个全新的字符串,因此,所有访问的新密钥都将获得从callable返回的默认值.
(在这种情况下,ht最初是空的dict,完全没有区别ht = defaultdict(lambda:0),ht = defaultdict(int)或者ht = defaultdict(lambda:0, ht):它们都会构建相同的defaultdict.


Mon*_*aro 34

我想你可以传递一个返回的lambda函数 1

d = defaultdict(lambda:1)
Run Code Online (Sandbox Code Playgroud)


Ran*_*ili 7

相当于@Montaro的答案:

def a():
    return 1

d = defaultdict(a)
Run Code Online (Sandbox Code Playgroud)