defaultdict(lambda:None)和defaultdict(int)

时间:2015-11-22 16:56:36

标签: python lambda defaultdict

TYPE lambdadefaultdict一起使用时究竟做了什么?我有这个例子,即使是intlist& lambda作为参数:

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字典并不关心传入什么类型的参数。

2 个答案:

答案 0 :(得分:4)

您没有使用默认值工厂。如果您所做的只是分配给密钥,而不是尝试检索尚未在字典中的密钥,您将看不出有什么区别。

默认值factory(<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" /> <div class="container"> <h2>Horizontal form</h2> <form class="form-horizontal myForm" role="form"> <div class="form-group"> <label class="control-label col-sm-2" for="email">Email:</label> <div class="col-sm-10"> <input type="email" class="form-control" id="email" placeholder="Enter email"> </div> </div> <div class="form-group "> <label class="control-label col-sm-2" for="pwd">Password:</label> <div class="col-sm-10"> <input type="password" class="form-control" id="pwd" placeholder="Enter password"> </div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="designation">Designation:</label> <div class="col-sm-4"> <select class="form-control" id="designation" onchange="updateText('designation')"> <option value="" disabled selected>Select Designation</option> <option value="04">Chairman</option> <option value="03">Dean</option> </select> </div> <label for="designationText" class="control-label col-sm-2" id="form-group-top" for="designationText">Designation Code</label> <div class="col-sm-4"> <input type="text" value="" class="form-control" id="designationText" placeholder="Code" /> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox">Remember me</label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default">Submit</button> </div> </div> </form> </div>的第一个参数)是而不是类型声明。无论何时尝试访问字典中尚未出现的密钥,它都会被称为

defaultdict()

我第一次尝试访问密钥>>> 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'密钥。

如果您访问了一个不存在的密钥,那么您已经创建了一个值为0的整数,一个空列表或'one'

答案 1 :(得分:4)

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

>>> d = defaultdict(int)
>>> d['one']
0
>>> d = defaultdict(list)
>>> d['one']
[]
>>> d = defaultdict(lambda: None)
>>> d['one'] is None
True

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

这就是默认字典的作用。没别了。

这样做的想法是,您可以设置第一次要访问密钥时不需要手动设置的默认值。例如,像这样:

d = {}
for item in some_source_for_items:
    if item['key'] not in d:
        d[item['key']] = []

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

只是在访问每个字典项时为其设置一个新的空列表,可以简化为:

d = defaultdict(list)
for item in some_source_for_items:
    d[item['key']].append(item)

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