首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python defaultdict

Python defaultdict
EN

Stack Overflow用户
提问于 2021-01-04 12:14:51
回答 3查看 226关注 0票数 1

我发现了一些我无法理解的奇怪的东西。情况就是这样:

代码语言:javascript
复制
from collections import defaultdict
a = defaultdict(lambda: len(a))

这只是代码的一部分,代码从未定义过上面的“a”。

问题如下:

  • 是否可以按原样使用defaultdict,而不事先指定变量?如果可能的话,
  • ,代码的含义是什么?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-04 12:25:01

也许最好用一个例子来解释:

代码语言:javascript
复制
>>> a = defaultdict(lambda: len(b))
>>> b = 'abcd'
>>> a[0]
4

正如您所看到的,即使blambda中还不存在,也可以在lambda中使用b。重要的是,b在执行lambda时存在。此时,Python将查找一个名为b的变量并使用它。

还请注意,原始代码不一定使用defaultdict本身的长度。它只是简单地评估任何a是在这一点上。参见此示例:

代码语言:javascript
复制
>>> a = defaultdict(lambda: len(a))
>>> a['a']
0
>>> a['b']
1

到现在为止还好。但是,重新命名一些东西:

代码语言:javascript
复制
>>> x = a
>>> a = []
>>> x['c']
0
>>> x['d']
0

现在,deaultdict被命名为x,但它不使用len(x)。它仍然使用len(a)。如果将defaultdict发送到a没有任何意义的函数,则此警告可能变得非常重要。

票数 2
EN

Stack Overflow用户

发布于 2021-01-04 12:27:44

您说的是默认dict,当我尝试用键做一些事情,但它不存在时,使用这个lambda作为键的初始值。因为您的lambda使用的是一个(即切分它自己),并且您说它的长度。这意味着当您使用不在dict中的键执行操作时,dict将使用lambda代替,或者在本例中使用dict的长度作为值。

代码语言:javascript
复制
from collections import defaultdict
a = defaultdict(lambda: len(a))

a['one'] += 5 #here dict length is 0 so value is 0 + 5 = 5
a['two'] += 2 #jere dict length is 1 so value is 1 + 2 = 3
a['three'] += 1 #here dict length is 2 so value is 2 + 1 = 3
print(a.items())
print(a['newval']) #here newval doesnt exist so will use default value which is length of dict I.E 3

输出

代码语言:javascript
复制
dict_items([('one', 5), ('two', 3), ('three', 3)])
3
票数 1
EN

Stack Overflow用户

发布于 2021-01-04 12:28:51

以下是defaultdict的工作原理。假设您有一组列表,并且正在为可能不存在的键设置值。在这种情况下,你会做这样的事情:

代码语言:javascript
复制
d = dict()
if some_key not in d:
    d[some_key] = list()
d[some_key].append(some_value)

defaultdict自动为您传递一个可调用的值,例如,intlistset,它们将分别调用int() (默认值0)、list() (默认值空列表)和set() (默认值空集)。您的lambda也是一个可调用的,它返回整数,所以您将有一个带有int值的dict。但是从表达式中得到的值将取决于dict的大小。

你能做a = defaultdict(lambda: len(a))吗?

可以,停那儿吧。在调用之前,不会执行lambda,这是它查找名称a的时候。比较这两种情况。

代码语言:javascript
复制
f = lambda: len(a)
a = defaultdict(f)
a[0]                  # this is when the lambda is called for the first time

但,

代码语言:javascript
复制
g = lambda: len(b)
g()                   # this will raise a NameError
b = defauldict(g)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65562568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档