我已经阅读了python文档中的示例,但仍然无法弄清楚这个方法的含义.有人可以帮忙吗?以下是python文档中的两个示例
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
Run Code Online (Sandbox Code Playgroud)
和
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Run Code Online (Sandbox Code Playgroud)
参数int
和list
用于什么?
有没有办法使defaultdict也成为defaultdict的默认值?(即无限级递归defaultdict?)
我希望能够做到:
x = defaultdict(...stuff...)
x[0][1][0]
{}
Run Code Online (Sandbox Code Playgroud)
所以,我可以这样做x = defaultdict(defaultdict)
,但那只是第二级:
x[0]
{}
x[0][0]
KeyError: 0
Run Code Online (Sandbox Code Playgroud)
有些食谱可以做到这一点.但是它可以简单地使用普通的defaultdict参数吗?
注意这是在询问如何进行无限级别的递归defaultdict,所以它与Python不同:defaultdict的defaultdict?,这是如何做一个两级默认.
我可能最终会使用束模式,但当我意识到我不知道如何做到这一点时,它让我感兴趣.
我有一个关于习语和可读性的问题,似乎有一个针对这个特殊情况的Python哲学冲突:
我想从字典B中构建字典A.如果B中不存在特定的键,则不执行任何操作并继续.
哪种方式更好?
try:
A["blah"] = B["blah"]
except KeyError:
pass
Run Code Online (Sandbox Code Playgroud)
要么
if "blah" in B:
A["blah"] = B["blah"]
Run Code Online (Sandbox Code Playgroud)
"做并请求原谅"与"简单和明确".
哪个更好?为什么?
我怎样才能转换defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
Run Code Online (Sandbox Code Playgroud)
成为一个普通的词典?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Run Code Online (Sandbox Code Playgroud) 在别人的代码中,我读了以下两行:
x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))
Run Code Online (Sandbox Code Playgroud)
由于defaultdict的参数是默认工厂,我认为第一行意味着当我为不存在的密钥k调用x [k]时(例如像v = x [k]这样的语句),键值对(k) ,0)将自动添加到字典中,就像首次执行语句x [k] = 0一样.我对么?
你呢?似乎默认工厂将创建一个默认为0的defaultdict.但这具体意味着什么呢?我尝试在Python shell中使用它,但无法弄清楚它究竟是什么.
比方说我有:
action = '{bond}, {james} {bond}'.format(bond='bond', james='james')
Run Code Online (Sandbox Code Playgroud)
这个输出:
'bond, james bond'
Run Code Online (Sandbox Code Playgroud)
接下来我们有:
action = '{bond}, {james} {bond}'.format(bond='bond')
Run Code Online (Sandbox Code Playgroud)
这将输出:
KeyError: 'james'
Run Code Online (Sandbox Code Playgroud)
是否有一些解决方法可以防止此错误发生,例如:
我有一个看起来像这样的defaultdict:
dict1 = defaultdict(lambda: defaultdict(int))
Run Code Online (Sandbox Code Playgroud)
问题是,我不能用cPickle来腌制它.我在这里找到的解决方案之一是使用模块级函数而不是lambda.我的问题是,什么是模块级功能?如何在cPickle中使用字典?
传递int
和lambda: 0
作为参数之间有什么区别吗?或者之间list
和lambda: []
?
看起来他们做同样的事情:
from collections import defaultdict
dint1 = defaultdict(lambda: 0)
dint2 = defaultdict(int)
dlist1 = defaultdict(lambda: [])
dlist2 = defaultdict(list)
for ch in 'abracadabra':
dint1[ch] += 1
dint2[ch] += 1
dlist1[ch].append(1)
dlist2[ch].append(1)
print dint1.items()
print dint2.items()
print dlist1.items()
print dlist2.items()
## -- Output: --
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', [1, 1, 1, 1, 1]), …
Run Code Online (Sandbox Code Playgroud) 我是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
Run Code Online (Sandbox Code Playgroud)
就像在func的前两行中一样
ht = {}
ht = defaultdict(lambda:0, ht)
Run Code Online (Sandbox Code Playgroud)
关于这个初始化我不是很清楚.你能不能帮我解决一下?还有,我们只需用以下内容替换这两行吗?
ht = defaultdict(int) # default value 0
Run Code Online (Sandbox Code Playgroud) 我defaultdict(set)
用来填充非常大的数据结构中的内部映射.填充后,整个结构(包括映射)将暴露给客户端代码.那时,我不希望任何人修改映射.
并且没有人故意这样做.但有时,客户端代码可能会意外地引用不存在的元素.此时,普通字典会引发KeyError
,但由于映射是defaultdict
,它只是在该键上创建一个新元素(空集).这很难理解,因为一切都是默默无闻的.但我需要确保不会发生这种情况(语义实际上不会中断,但映射会变得很大).
我该怎么办?我可以看到这些选择:
查找当前和未来客户端代码中的所有实例,其中对映射执行字典查找,并将其转换为其他实例mapping.get(k, {})
.这太可怕了.
defaultdict
数据结构完全初始化后,通过将其转换为"冻结" dict
.(我知道它并没有真正冻结,但我相信客户端代码实际上并没有写mapping[k] = v
.)不雅,并且性能大.
包装defaultdict
成一个dict
界面.这样做的优雅方式是什么?我担心性能损失可能很大(这种查找在紧密循环中被大量使用).
子类defaultdict
并添加一个"关闭"所有defaultdict
功能的方法,使其表现得像是常规的dict
.这是上面3的变种,但我不确定它是否更快.如果不依赖于实施细节,我不知道它是否可行.
dict
在数据结构中使用regular ,重写那里的所有代码,首先检查元素是否在字典中,如果不在,则添加它.不好.
defaultdict ×10
python ×10
collections ×2
dictionary ×1
idioms ×1
missing-data ×1
pickle ×1
python-3.x ×1
readability ×1
recursion ×1
string ×1
wrapper ×1