如何创建字典的默认字典

时间:2016-05-02 04:24:40

标签: string python-3.x dictionary nested defaultdict

我正在尝试编写一些涉及创建字典的默认字典的代码。但是,我不知道如何初始化/创建这样的东西。我目前的尝试看起来像这样:

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}})

刚刚运行它现在似乎没有输出任何错误,但我只是想知道这样的东西是否会实际产生一个默认的字典词典。

如果这是重复的道歉,不过这些问题的先前答案一直令人困惑,并且在不同的背景下。

3 个答案:

答案 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

tl; dr

这是您的单行答案my_dict[0][0] >>> [] my_dict[5] >>> defaultdict(<class 'list'>, {})