TYPE lambda
与defaultdict
一起使用时究竟做了什么?我有这个例子,即使是int
,list
& 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
字典并不关心传入什么类型的参数。
答案 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
将确保正确初始化列表。