我是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
答案 0 :(得分:34)
简短回答(根据Montaro的回答)
defaultdict(lambda:1)
关于defaultdict
工作方式的长篇答案
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
与dict
的不同之处在于,当您尝试使用不存在的密钥访问常规dict
时,会引发KeyError
。
defaultdict不会引发错误:它会为您创建密钥。有哪些价值?随着你作为参数传递的callabe
的返回。在这种情况下,将使用值0
(这是简单lambda
函数lambda:0
的返回)创建每个新键,这也恰好是{{1 },所以在本例中,将默认函数更改为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)
。
答案 1 :(得分:32)
我认为你可以传递一个返回1
d = defaultdict(lambda:1)
答案 2 :(得分:1)
相当于@Montaro 的回答:
def a():
return 1
d = defaultdict(a)