Python loop/comprehension 嵌套字数

Python loop/comprehension for a nested word count

我正在分析一些用户数据,我有一个(预处理为小写的)用户名列表,如下所示: name_list = ['joebob', 'sallycat', 'bigbenny', 'davethepirate', 'nightninja', ...(many more)] 和一本比较词典,我想 运行 对这些名称进行比较,以了解某些词与其他词相比出现的频率。例如...

comparisons = {"Pirates vs Ninjas": ["pirate", "ninja"],
               "Cats vs Dogs": ["cat", "dog"]}

我正在尝试获得 loop/comprehension 输出看起来像

{"Pirates vs Ninjas": {"pirate": 224, "ninja": 342},
 "Cats vs Dogs": {"cat": 430, "dog": 391}}

(以上数字只是最终结果字数的示例)

我知道让它工作所需的所有单独组件(字典理解和 dict.get)。将它们放在一起的正确方法是什么?

编辑澄清:我想看看有多少用户名包含单词“猫”,并将其记录在包含单词“狗”的数字旁边。结果将记录在一个关键字为“Cats vs Dogs”的字典中。然后我会继续对下一个比较“海盗 vs 忍者”做同样的事情。

from collections import Counter

c = Counter(user_names)

result = {category: {entry: c[entry] for entry in entries}
          for category, entries in comparisons.items()}

首先 运行 一个 Counter 在列表上得到一个 username -> count 映射,然后通过 [= 使用字典和列表理解15=]。如果 entry 不存在,计数器给出 0。

以上,例如:

  • category == "Pirates vs Ninjas"
  • entry == "pirate"
  • entries == ["pirate", "ninja"]

示例数据:

user_names = ["pirate", "dog", "this", "ninja", "that", "cat", "cat", "ninja", "other", "cat"]

c = Counter(user_names)

result = {category: {entry: c[entry] for entry in entries}
          for category, entries in comparisons.items()}

然后

>>> result

{"Pirates vs Ninjas": {"pirate": 1, "ninja": 2}, "Cats vs Dogs": {"cat": 3, "dog": 1}}

如果要允许不区分大小写和部分匹配,我们不会使用 Counter,而是 sum:

result = {category: {entry: sum(entry in name for name in user_names) 
                                for entry in map(str.lower, entries)}
          for category, entries in comparisons.items()}

我们首先在搜索之前将 entries 映射到小写,我们不仅计算完全匹配,还计算通过 in 运算符和 sum 的“包含”类型匹配。