向defaultdict(dict)添加键

2024-04-29 03:04:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个defaultdict如下所示:

my_dict = defaultdict(dict)

将打印出:

defaultdict(<class 'dict'>, {})

我还有两个列表,如下所示:

list1 =  ["W", "IY", "W"]
list2 =  ["w", "ee", "w"]

我想创建一个默认的dict,如下所示:

defaultdict(<class 'dict'>, {'W': {'w': 2}, 'IY': {'ee': 1}}

它将字典中的list1作为键,将键作为下一个带有单独字典的列表,将list2的实例作为值进行计数。

到目前为止我有这个:

from collections import defaultdict

d = defaultdict(dict)

list1 = ["W", "IY", "W"]
list2 = ["w", "ee", "w"]

for char in list1:
    d[char] += 1

我知道这是不正确的,因为defaultdict(dict)不能这样对待。我有办法做到这一点吗?任何帮助都将不胜感激:)


Tags: 实例from列表字典mydicteeclass
3条回答

根据对我最初答案的评论进行编辑。

你需要把所有可能的音素映射到所有可能的拼写(字形)。

phonemes = {TH : [th], O : [o], OH : [oh, oo]}

for char in set(list1):
    if char not in d:
        d[char] = {char.lower() : {phone : list2.count(phone) for phone in phonemes[char]}}

这是一个使用collections.Counter的解决方案。

import collections
d = collections.defaultdict(collections.Counter)

list1 = ["O", "TH", "O", "O"]
list2 = ["o", "th", "o", "o1"]

for key, value in zip(list1, list2):
    d[key].update([value])

>>> d
defaultdict(<class 'collections.Counter'>, {'TH': Counter({'th': 1}), 'O': Counter({'o': 2, 'o1': 1})})
>>>

虽然这并不严格遵循您的要求,collections.Counter继承自dict,因此它具有dict的所有属性

您还可以使用嵌套的defaultdict和^{},如下所示:

d = defaultdict(lambda: defaultdict(int))
for k, v in zip(list1, list2):
    d[k][v] += 1
# d['TH']['th']: 1
# d['O']['o']: 2

或者,如果要保留数据结构:

d = defaultdict(dict)
for k, v in zip(list1, list2):
    d[k][v] = d[k].get(v, 0) + 1  
    # use dict.get(key, default=None) and specify an appropriate default value (0)

使用^{}可以访问公共dict的键值,这与defaultdict非常相似,但是,更新有点笨拙。

相关问题 更多 >