首页 > 解决方案 > 计算字典中列表中单词的频率

问题描述

我有一个常用关键字列表:

common_keywords = ['dog', 'person', 'cat']

还有一个字典列表,包含关键字,有时还包括common_keywords上面列出的:

people = [{'name':'Bob', 'keywords': ['dog', 'dog', 'car', 'trampoline']},
          {'name':'Kate', 'keywords': ['cat', 'jog', 'tree', 'flower']},
           {'name':'Sasha', 'keywords': ['cooking', 'stove', 'person', 'cat']}]

我想计算common_keywords每个人的频率,所以所需的输出看起来像:

counts = [{'name': 'Bob', 'counts': [{'dog': 2}]}, 
          {'name': 'Kate', 'counts': [{'cat': 1}]}, 
          {'name': 'Sasha', 'counts': [{'person':1}, {'cat': 1}]]

dict(Counter())如果它们出现在 中,我可以用来计算关键字并过滤它们,common_keywords但我正在努力将这些计数链接回原始名称,如所需的输出所示:counts.

当前代码(我想我正在慢慢到达那里):

freq_dict = {}
for p in people:
    name = p['name']
    for c in p['keywords']:
        if c not in freq_dict:
            freq_dict[name] = {c: 1}
        else: 
            if c not in freq_dict[name]:
                freq_dict[c] = 1
            else:
                freq_dict[c] +=1

标签: pythondictionarycounternested-lists

解决方案


您可以使用 list-comprehension 以及collections.Counter它完全符合您对嵌套列表的要求。-

from collections import Counter

[{'name':i.get('name'),
  'keywords':[dict(Counter([j for j in i.get('keywords') 
                            if j in common_keywords]))]} for i in people]
[{'name': 'Bob', 'keywords': [{'dog': 2}]},
 {'name': 'Kate', 'keywords': [{'cat': 1}]},
 {'name': 'Sasha', 'keywords': [{'person': 1, 'cat': 1}]}]

  1. 首先,通过列表理解,您希望使用与i.get('key'). 这将允许使用关键字的嵌套列表值。
  2. 遍历列表并仅过滤 common_keywords 中的那些
  3. 将此列表传递给 collections.Counter 以获取您的字典
  4. 将其作为列表返回,其中包含您期望的单个 dict

推荐阅读