Roa*_*ner 14 python dictionary
我有一个看起来像这样的defaultdict:
my_dict = defaultdict(dict)
Run Code Online (Sandbox Code Playgroud)
将打印出来:
defaultdict(<class 'dict'>, {})
Run Code Online (Sandbox Code Playgroud)
我还有两个列表,如下所示:
list1 = ["W", "IY", "W"]
list2 = ["w", "ee", "w"]
Run Code Online (Sandbox Code Playgroud)
我想创建一个默认的dict,如下所示:
defaultdict(<class 'dict'>, {'W': {'w': 2}, 'IY': {'ee': 1}}
Run Code Online (Sandbox Code Playgroud)
其中list1在字典中作为键,键作为下一个列表,带有单独的字典,将list2的实例计为值.
到目前为止我有这个:
from collections import defaultdict
d = defaultdict(dict)
list1 = ["W", "IY", "W"]
list2 = ["w", "ee", "w"]
for char in list1:
d[char] += 1
Run Code Online (Sandbox Code Playgroud)
我知道这是不正确的,因为defaultdict(dict)不能以这种方式处理.我有办法做到这一点吗?任何帮助将不胜感激 :)
这是一个使用的解决方案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})})
>>>
Run Code Online (Sandbox Code Playgroud)
虽然这并不严格遵循您的要求,但collections.Counter继承自dict具有所有dict属性
根据对我原来答案的评论进行编辑。
您需要将所有可能的音素映射到所有可能的拼写(字素)。
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]}}
Run Code Online (Sandbox Code Playgroud)