我有一个看起来像这样的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)不能以这种方式处理。我有办法做到这一点吗?任何帮助将不胜感激:)
答案 0 :(得分:6)
以下是使用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
的所有属性
答案 1 :(得分: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]}}
答案 2 :(得分:3)
你也可以使用嵌套的defaultdict和zip
,如下所示:
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.get(key, default=None)
可以访问公共dict
的键值,就像默认用户一样,但更新更加笨拙。
答案 3 :(得分:2)
采取一种解决方案略有不同:
import collections
phonemes = ["W", "IY", "O", "W", "O"]
graphemes = ["w", "ee", "o", "w", "oh"]
# count all the (phoneme, grapheme) pairs
counter = collections.Counter(zip(phonemes, graphemes))
# convert to desired data structure
d = collections.defaultdict(dict)
for (phoneme, grapheme), count in counter.items():
d[phoneme][grapheme] = count
print(d)
打印:
defaultdict(<class 'dict'>, {'W': {'w': 2}, 'O': {'oh': 1, 'o': 1}, 'IY': {'ee': 1}})