- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
dict
提供 .setdefault()
,它允许您动态地将任何类型的值分配给缺失的键:
>>> d = dict()
>>> d.setdefault('missing_key', [])
[]
>>> d
{'missing_key': []}
然而,如果您使用 defaultdict
来完成相同的任务,那么每当您尝试访问或修改丢失的 key 时,都会根据需要生成默认值:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['missing_key']
[]
>>> d
defaultdict(<class 'list'>, {'missing_key': []})
但是,使用 defaultdict
实现的以下代码会引发 KeyError
,而不是使用默认值 {}
创建项目:
trie = collections.defaultdict(dict)
for word in words:
t = trie
for c in word:
t = t[c]
t["*"] = word
使用.setdefault()
工作正常:
trie = {}
for word in words:
t = trie
for c in word:
t = t.setdefault(c, {})
t["*"] = word
访问前检查,也可以正常工作:
trie = {}
for word in words:
t = trie
for c in word:
if c not in t:
t[c] = {}
t = t[c]
t["*"] = word
使用collections.defaultdict()
时我缺少什么?
注意我正在尝试构建一个 Trie由单词列表构成的结构。例如:
words = ["oath", "pea", "eat", "rain"]
trie = {'o': {'a': {'t': {'h': {'*': 'oath'}}}}, 'p': {'e': {'a': {'*': 'pea'}}}, 'e': {'a': {'t': {'*': 'eat'}}}, 'r': {'a': {'i': {'n': {'*': 'rain'}}}}}
最佳答案
在你的第一个例子中,当你执行 t = t[c] 时,t 变成一个常规的空 dict
(因为这是你告诉 defaultdict
在trie 的定义
)。
让我们用示例单词“oath”来运行循环:
1) t = trie, word = "oath"
2) c = "o"
3) t = t[c]
3.1) evaluation of t[c] # "o" is not in trie, so trie generates an empty dict at key "o" and returns it to you
3.2) assignment to t -> t is now the empty dict. If you were to run (t is trie["o"]), it would evaluate to True after this line
4) c = "a"
5) t = t[c]
5.1) Evaluation of t[c] -> "a" is not in the dict t. This is a regular dict, raise KeyError.
不幸的是,由于 Trie 的任意嵌套,我想不出在这里使用 defaultdict
的方法( but Marius could, see this answer )。您需要将 trie 定义为默认字典,如果缺少键,它会生成一个默认字典,如果缺少键,它本身会生成一个默认字典,递归地直到最大深度(其中,在原理,未知)。
IMO,实现此目的的最佳方法是使用 setdefault
,就像您在第二个示例中所做的那样。
关于python - 澄清行为 : collections. defaultdict 与 dict.setdefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63131000/
我有以下代码片段: mirna2age = {} for i in agesdb: mirna2age.setdefault(i[0],default=[]).append(i[1]) 但是,
TimeZone.setDefault 时区似乎不支持夏令时。如果我保留默认值(不使用函数 setDefault),应用程序将显示 EST/EDT 中的日期。但如果我想更改时区(我使用 TimeZon
给出以下通用代码: def soapQuery(): soapuser = "Base64String" soappass = "Base64String" soapurl =
这个问题已经有答案了: python dict setdefault, confused (3 个回答) 已关闭 6 年前。 有人可以解释一下在下面的情况下如何对字典“inverse”进行赋值吗? d
dict.setdefault 的一个小烦恼是它总是评估它的第二个参数(当然,当给定时),即使第一个参数已经是字典中的键。 例如: import random def noisy_default():
这是来自 Django's authentification models 的一段代码(用户经理): def create_superuser(self, username, email, passw
我的应用程序用户可以从应用程序的设置页面更改应用程序语言,因此我使用 Resources.updateConfiguration() 开发它。和 Context.createConfiguration
这是来自 Django's authentification models 的一段代码(用户经理): def create_superuser(self, username, email, passw
我想在 Java 小程序中进行简单的 HTTP 身份验证,我正在尝试这种方式: static class MyAuthenticator extends Authenticator {
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我从 Automate the boring stuff with Python 一书中得到这段代码,但我不明白 setdefault() 方法如何计算唯一字符的数量。 代码: message = '
我想知道是否有一种方法可以使用类似 lambda 的样式来附加到已排序的字典列表字段中。 示例: a = {} a.setdefault("foo", []).append(2) a.setdefau
这个问题在这里已经有了答案: Python list + list vs. list.append() (2 个答案) 关闭 7 年前。 我有下面的代码,我试图在输入中每次出现时将 1 append
为了说明这个问题,我创建了一个简单的例子: #!/usr/bin/env python class Person(): def __init__(self): self.cac
我一直在寻找一种算法,但我无法弄清楚为什么字典 d 中有值而 curr 中没有。我认为似乎没有对 dict d 做任何事情。 >>> def what(*words): ... d = {}
在 Python 2.5 中添加的 collections.defaultdict 大大减少了对 dict 的 setdefault 方法的需求。这个问题是针对我们的集体教育的: setdefault
我正在寻找一种更好的方法来设置 Java 的默认时区。我们当前正在访问 DB2 数据库以获取其当前时区,但它不是时区名称,只是当前的小时/分钟偏移值。因此,我们采用该值并构造一个类似“GMT-07:0
我正在使用 jQuery timepicker 插件来扩展 jQuery datepicker,它允许我有一个日期+时间选择器。 link to the addon 为了设置格式设置和区域设置等默认设
如果我有这样的声明: INSERT INTO foo (id, name, description, etc_a, etc_b) VALUES (?, ?, ?, ?, ?); 它被传递到 Prepa
使用集合时的常见模式如下: number_list = [1,5,7,2,4,4,1,3,8,5] number_set = set() for number in number_list: #
我是一名优秀的程序员,十分优秀!