在字典中聚合和重命名键

3
我是一名有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我有一个单词出现字典和一个同义词字典。

单词出现字典示例:

word_count = {'grizzly': 2, 'panda': 4, 'beer': 3, 'ale': 5}

同义词字典示例:

synonyms = {
            'bear': ['grizzly', 'bear', 'panda', 'kodiak'],
            'beer': ['beer', 'ale', 'lager']
           }

我希望将单词计数字典合并/重命名为
new_word_count = {'bear': 6, 'beer': 8}

我想尝试这个:

new_dict = {}
for word_key, word_value in word_count.items():           # Loop through word count dict
    for syn_key, syn_value in synonyms.items():           # Loop through synonym dict
        if word_key in [x for y in syn_value for x in y]: # Check if word in synonyms
            if syn_key in new_dict:                       # If so:
                new_dict[syn_key] += word_value           #   Increment count
            else:                                         # If not:
                new_dict[syn_key] = word_value            #   Create key

但这并没有起作用,new_dict最终为空。另外,是否有更简单的方法来做到这一点?也许可以使用字典推导式吗?
2个回答

4
使用字典推导,sumdict.get
In [11]: {w: sum(word_count.get(x, 0) for x in ws) for w, ws in synonyms.items()}
Out[11]: {'bear': 6, 'beer': 8}

使用 collections.Counterdict.get

from collections import Counter
ec = Counter()
for x, vs in synonyms.items():
    for v in vs:
        ec[x] += word_count.get(v, 0)
print(ec) # Counter({'bear': 6, 'beer': 8})

1

让我们稍微更改一下同义词字典。不再将单词映射为其所有同义词列表,而是将单词映射为其父级同义词(例如,将ale映射到beer)。这样应该可以加快查找速度。

synonyms = {
            'bear': ['grizzly', 'bear', 'panda', 'kodiak'],
            'beer': ['beer', 'ale', 'lager']
           }
synonyms = {syn:word for word,syns in synonyms.items() for syn in syns}

现在,让我们制作您的聚合字典:
word_count = {'grizzly': 2, 'panda': 4, 'beer': 3, 'ale': 5}
new_word_count = {}
for word,count in word_count:
    word = synonyms[word]
    if word not in new_word_count:
        new_word_count[word] = 0
    new_word_count[word] += count

谢谢。这帮助我找到了原始代码中的错误。我采用了先前答案的字典推导式以实现简洁。 - nfmcclure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接