默认值为 1 的 defaultdict?
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
与函数的前两行一样,它是
ht = {}
ht = defaultdict(lambda:0, ht)
这个我不是很清楚initialization.Could请你帮我看看?还有,我们可以用以下内容替换这两行吗?
ht = defaultdict(int) # default value 0
简答(根据下面蒙塔罗的回答)
defaultdict(lambda:1)
详细回答 defaultdict
的工作原理
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
与 dict
的不同之处在于,当您尝试使用不存在的密钥访问常规 dict
时,它会引发 KeyError
。但是,
defaultdict
不会引发错误:它会为您创建密钥。有什么价值?使用 callable
的 return 作为参数传递。在这种情况下,每个新键都将使用值 0
创建(这是简单 lambda
函数 lambda:0
的 return),这也恰好是相同的 return 的 int()
,所以在 这种情况 中,将默认函数更改为 int()
.
没有区别
更详细地分解这一行:ht = defaultdict(lambda:0, ht)
第一个参数是一个函数,它是一个可调用对象。这是将被调用来为不存在的键创建新值的函数。第二个参数 ht
是可选的,它指的是新 defaultdict
将建立的基础字典。因此,如果 ht
有一些键和值,那么 defaultdict
也会有这些键和相应的值。如果您尝试访问这些键,您将获得旧值。
但是,如果您没有传递基本字典,则会创建一个全新的 defaultdict
,因此,所有访问的新键都将从可调用的 return 中获得默认值。
(在这种情况下,由于 ht
最初是一个空的 dict
,因此执行 ht = defaultdict(lambda:0)
、 ht = defaultdict(int)
或 ht = defaultdict(lambda:0, ht)
完全没有区别:它们会全部构建相同 defaultdict
.
我想你可以传递一个 lambda 函数 returns 1
from collections import defaultdict
d = defaultdict(lambda: 1)
相当于@Montaro 的回答:
def a():
return 1
d = defaultdict(a)
我是 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
与函数的前两行一样,它是
ht = {}
ht = defaultdict(lambda:0, ht)
这个我不是很清楚initialization.Could请你帮我看看?还有,我们可以用以下内容替换这两行吗?
ht = defaultdict(int) # default value 0
简答(根据下面蒙塔罗的回答)
defaultdict(lambda:1)
详细回答 defaultdict
的工作原理
ht = {}
ht = defaultdict(lambda:0, ht)
defaultdict
与 dict
的不同之处在于,当您尝试使用不存在的密钥访问常规 dict
时,它会引发 KeyError
。但是,
defaultdict
不会引发错误:它会为您创建密钥。有什么价值?使用 callable
的 return 作为参数传递。在这种情况下,每个新键都将使用值 0
创建(这是简单 lambda
函数 lambda:0
的 return),这也恰好是相同的 return 的 int()
,所以在 这种情况 中,将默认函数更改为 int()
.
更详细地分解这一行:ht = defaultdict(lambda:0, ht)
第一个参数是一个函数,它是一个可调用对象。这是将被调用来为不存在的键创建新值的函数。第二个参数 ht
是可选的,它指的是新 defaultdict
将建立的基础字典。因此,如果 ht
有一些键和值,那么 defaultdict
也会有这些键和相应的值。如果您尝试访问这些键,您将获得旧值。
但是,如果您没有传递基本字典,则会创建一个全新的 defaultdict
,因此,所有访问的新键都将从可调用的 return 中获得默认值。
(在这种情况下,由于 ht
最初是一个空的 dict
,因此执行 ht = defaultdict(lambda:0)
、 ht = defaultdict(int)
或 ht = defaultdict(lambda:0, ht)
完全没有区别:它们会全部构建相同 defaultdict
.
我想你可以传递一个 lambda 函数 returns 1
from collections import defaultdict
d = defaultdict(lambda: 1)
相当于@Montaro 的回答:
def a():
return 1
d = defaultdict(a)