首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >defaultdict(lambda: and )和defaultdict(int)之间的差异

defaultdict(lambda: and )和defaultdict(int)之间的差异
EN

Stack Overflow用户
提问于 2015-11-22 16:56:36
回答 2查看 11K关注 0票数 6

当与lambda一起使用时,类型defaultdict到底是做什么的?我有这个示例,甚至对于intlistlambda作为参数也很好:

代码语言:javascript
复制
d = defaultdict(int)
d['one'] = lambda x:x*x
d['one'](2)
4

d = defaultdict(list)
d['one'] = lambda x:x*x
d['one'](2)
4

d = defaultdict(lambda: None)
d['one'] = lambda x:x*x
d['one'](2)
4

我每次都有同样的结果。那么,使用lambda "default (lambda: None)“初始化的主要原因是什么?defaultdict字典并不关心传入哪种类型的参数。

EN

回答 2

Stack Overflow用户

发布于 2015-11-22 17:23:27

只有当您访问未显式添加到字典中的键时,您的示例才有意义:

代码语言:javascript
复制
>>> d = defaultdict(int)
>>> d['one']
0
>>> d = defaultdict(list)
>>> d['one']
[]
>>> d = defaultdict(lambda: None)
>>> d['one'] is None
True

正如您所看到的,使用默认dict将给您尝试访问默认值的每个键。该默认值是通过调用传递给构造函数的函数获得的。因此,传递intint()设置为默认值( 0);传递list将将list()设置为默认值(这是一个空列表[]);传递lambda: None将将(lambda: None)()设置为默认值(即None)。

默认字典就是这么做的。没别的了。

这样,您就可以设置默认设置,在第一次访问密钥时不需要手动设置这些默认值。例如,类似这样的东西:

代码语言:javascript
复制
d = {}
for item in some_source_for_items:
    if item['key'] not in d:
        d[item['key']] = []

    d[item['key']].append(item)

只要在访问每个字典项时设置一个新的空列表,就可以简化为以下内容:

代码语言:javascript
复制
d = defaultdict(list)
for item in some_source_for_items:
    d[item['key']].append(item)

defaultdict将确保正确初始化列表。

票数 7
EN

Stack Overflow用户

发布于 2015-11-22 16:59:14

您没有使用默认值工厂。如果您所做的只是分配给键,而不是尝试检索字典中还没有的键,您就不会看到区别。

默认值工厂(defaultdict()的第一个参数)不是类型声明。相反,每当您尝试访问字典中尚未包含的键时,都会调用它:

代码语言:javascript
复制
>>> from collections import defaultdict
>>> def demo_factory():
...     print('Called the factory for a missing key')
...     return 'Default value'
...
>>> d = defaultdict(demo_factory)
>>> list(d)  # list the keys
[]
>>> d['foo']
Called the factory for a missing key
'Default value'
>>> list(d)
['foo']
>>> d['foo']
'Default value'
>>> d['bar'] = 'spam'  # assignment is not the same thing
>>> list(d)
['foo', 'bar']
>>> d['bar']
'spam'    

只有在我第一次尝试访问密钥'foo'时,工厂才被调用以生成一个默认值,然后将其存储在字典中以供以后的访问。

因此,对于每个不同的示例,它们之间的不同之处在于为每个示例生成的默认值。您永远不会访问此功能,因为您直接分配给了'one'密钥。

如果您访问了一个不存在的键,您将分别创建一个值为0、空列表或None的整数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33857449

复制
相关文章

相似问题

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