如何用Python collections的Counter统计多列表单词并生成指定嵌套字典
解决方案:生成单词共现计数字典
嘿,我帮你调整了代码,正好能生成你想要的那种记录单词共现次数的字典。先看修改后的代码:
from collections import defaultdict, Counter def myFunc(word_lists): # 初始化嵌套结构,方便自动处理计数初始化 co_occurrence = defaultdict(Counter) # 先把所有出现过的唯一单词捞出来 all_unique_words = {word for sublist in word_lists for word in sublist} for sublist in word_lists: # 遍历当前子列表里的每一对不同单词 for idx, word_a in enumerate(sublist): for word_b in sublist[idx+1:]: # 互相累加共现次数——毕竟A和B一起出现,双方的计数都要加1 co_occurrence[word_a][word_b] += 1 co_occurrence[word_b][word_a] += 1 # 把嵌套的Counter转成普通字典,同时确保所有唯一单词都作为顶级键存在 final_result = {word: dict(co_occurrence[word]) for word in all_unique_words} return final_result # 测试调用 result = myFunc([['Apple', 'Orange', 'Banana'], ["Banana", "Orange"]]) print(result)
运行这段代码后,输出正好是你想要的格式:
{'Apple': {'Orange': 1, 'Banana': 1}, 'Orange': {'Apple': 1, 'Banana': 2}, 'Banana': {'Apple': 1, 'Orange': 2}}
简单解释下逻辑:
- 原来的代码只是统计每个子列表内的元素出现次数,没有跟踪不同单词之间的共现关系,所以得换个思路:遍历每个子列表里的每一对单词,只要它们在同一个子列表里出现,就互相给对方的计数加1。
- 用
defaultdict(Counter)是为了省去手动初始化每个单词的计数字典的麻烦,它会自动为新出现的单词创建空的Counter。 - 最后把嵌套的Counter转成普通字典,是为了让输出格式和你要求的完全一致。
内容的提问来源于stack exchange,提问作者Lucas123
相关产品推荐
相关产品推荐

