Python 默认值为1的defaultdict?
我是python新手,从某个地方读了一些代码片段。这是计数排序的一个实现 代码如下:Python 默认值为1的defaultdict?,python,defaultdict,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 =
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
s如何工作的详细答案
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
s与dict
的不同之处在于,当您尝试使用不存在的密钥访问常规dict
时,它会引发KeyError
defaultdict
,但不会引发错误:而是为您创建密钥。有什么价值?返回作为参数传递的callable
。在这种情况下,每个新键都将使用值0
(这是简单lambda
函数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
我认为您可以传递一个lambda函数,该函数返回1
d = defaultdict(lambda:1)
相当于@Montaro的答案:
def a():
return 1
d = defaultdict(a)
只要您是从集合导入,最好只使用一个
计数器
。那里的默认值不是1,而是0。尝试ht=defaultdict(lambda:1)#使用默认值1
并删除前面的ht={}
,因为您在下一行中更改了ht
的值,所以它没有任何作用。(lambda:0,ht)只是可以用0调用?这是正确的。我编辑了这篇文章,对其进行了更详细的分解,谢谢你的回答。你知道如何使常量始终不同吗?我解释:defaultdict(lambda:'string',ht)
将无法按预期工作,因为所有新密钥将共享相同的'string'
实例。如何每次提供一个副本?请注意defaultdict(lambda:copy.copy('string'),ht)
不起作用,因为copy
只计算一次。@Dr_Zaszuś抱歉,但我不理解您的示例。字符串是不可变的,有些是内部的,所以即使您执行x=“some string”
和b=copy.copy(x)
,您仍然可以发现x是b==True
。因此,在这种情况下,是否使用copy
并不重要。您能进一步解释一下吗?
def a():
return 1
d = defaultdict(a)