defaultdict,默认值为1?

时间:2015-05-20 17:48:31

标签: 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

与func的前两行一样,它是

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

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

ht = defaultdict(int) # default value 0

3 个答案:

答案 0 :(得分:34)

简短回答(根据Montaro的回答)

defaultdict(lambda:1)

关于defaultdict工作方式的长篇答案

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

defaultdictdict的不同之处在于,当您尝试使用不存在的密钥访问常规dict时,会引发KeyErrordefaultdict不会引发错误:它会为您创建密钥。有哪些价值?随着你作为参数传递的callabe的返回。在这种情况下,将使用值0(这是简单lambda函数lambda:0的返回)创建每个新键,这也恰好是{{1 },所以在本例中,将默认函数更改为int()没有区别。

更详细地分解这一行:int()

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

答案 1 :(得分:32)

我认为你可以传递一个返回1

的lambda函数
d = defaultdict(lambda:1)

答案 2 :(得分:1)

相当于@Montaro 的回答:

def a():
    return 1

d = defaultdict(a)