我正在尝试编写一些涉及创建字典的默认字典的代码。但是,我不知道如何初始化/创建这样的东西。我目前的尝试看起来像这样:
from collections import defaultdict
inner_dict = {}
dict_of_dicts = defaultdict(inner_dict(int))
使用这个字典的默认字典是为了从我打开的文件中生成的每对单词(例如[['M UH M','m oo m']]),设置每个段的第一个由空格分隔的单词作为外部字典中的键,然后对于由空格分隔的第二个单词中的每个段计算该段的频率。
例如
[['M UH M', 'm oo m']]
(<class 'dict'>, {'M': {'m': 2}, 'UH': {'oo': 1}})
刚刚运行它现在似乎没有输出任何错误,但我只是想知道这样的东西是否会实际产生一个默认的字典词典。
如果这是重复的道歉,不过这些问题的先前答案一直令人困惑,并且在不同的背景下。
答案 0 :(得分:0)
要初始化创建字典作为其默认值的defaultdict
,您将使用:
d = defaultdict(dict)
对于这个特殊问题,collections.Counter
会更合适
>>> from collections import defaultdict, Counter
>>> d = defaultdict(Counter)
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]):
... d[a][b] += 1
>>> print(d)
defaultdict(collections.Counter,
{'M': Counter({'m': 2}), 'UH': Counter({'oo': 1})})
修改强>
您表示对没有Counter
的等效评论感兴趣。以下是使用普通dict
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]):
... d[a][b] = d[a].get(b, 0) + 1
>>> print(d)
defaultdict(dict, {'M': {'m': 2}, 'UH': {'oo': 1}})
答案 1 :(得分:0)
您还可以使用普通字典及其{{1}}方法。
setdefault
会查找my_dict.setdefault(key, default)
和...
my_dict[key]
),然后返回。因此,当您想要从外部字典而不是普通my_dict[key] = default
获取值时,可以始终调用my_dict.setdefault(key, {})
,以便检索使用此密钥分配的实际值(如果它存在),或者获取一个新的空字典作为默认值,它也会自动存储到外部字典中。
示例:
my_dict[key]
这样,您始终可以获得有效的outer_dict = {"M": {"m": 2}}
inner_dict = d.setdefault("UH", {})
# outer_dict = {"M": {"m": 2}, "UH": {}}
# inner_dict = {}
inner_dict["oo"] = 1
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}}
# inner_dict = {"oo": 1}
inner_dict = d.setdefault("UH", {})
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}}
# inner_dict = {"oo": 1}
inner_dict["xy"] = 3
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1, "xy": 3}}
# inner_dict = {"oo": 1, "xy": 3}
,无论是空的默认值还是已经存在的给定键的值。由于字典是可变数据类型,修改返回的inner_dict
也会修改inner_dict
内的字典。
答案 2 :(得分:0)
其他答案提出了其他解决方案,或表明您可以使用id => value
但是问题问如何制作默认字典的默认字典,我的海军首次尝试是:
d = defaultdict(dict)
但这会引发错误:from collections import defaultdict
my_dict = defaultdict(defaultdict(list))
所以我的第二个可行的尝试是使用lambda关键字创建一个匿名函数来进行调用:
*** TypeError: first argument must be callable or None
比使用常规函数的替代方法更简洁:
from collections import defaultdict
my_dict = defaultdict(lambda: defaultdict(list))
您可以通过分配以下内容来检查其是否有效:
from collections import defaultdict
def default_dict_maker():
return defaultdict(list)
my_dict = defaultdict(default_dict_maker)
或尝试返回一个值:
my_dict[2][3] = 5
my_dict[2][3]
>>> 5
这是您的单行答案my_dict[0][0]
>>> []
my_dict[5]
>>> defaultdict(<class 'list'>, {})