Python:基于双列表生成Metapher与Anker词频字典的问题求助
问题描述
我有两个列表wofo(存储词汇)和role(标记词汇是Metapher或Anker),比如wofo包含Lichtfiguren、nachhängt等,role对应Metapher、Anker等标记。需要生成两个字典,分别统计每个词汇作为Metapher和Anker的出现次数,但尝试了两种代码都得到空字典,求错误原因、修复方法、更简便实现及相关搜索关键词。
第一种代码的错误原因
- 变量拼写错误:循环里的
elment应为element,导致无法正确匹配字典中的键。 - 多余的列表拆分:
wofo和role已经是列表,调用split("\n")会报错(列表无split方法);若原数据是字符串,拆分后会破坏原有的一一对应关系,导致字典键值对不匹配。 - 遍历对象不匹配:循环遍历原列表
wofo,但字典是用拆分后的wofo2生成的,两者元素不一致,导致dictionary.get(element)返回None,无法触发统计逻辑。
修复后的第一种代码
lemma_met = {} lemma_ank = {} # 直接用原列表生成一一对应的字典 word_role_dict = dict(zip(wofo, role)) for element in wofo: role_tag = word_role_dict.get(element) if role_tag == "Metapher": lemma_met[element] = lemma_met.get(element, 0) + 1 elif role_tag == "Anker": lemma_ank[element] = lemma_ank.get(element, 0) + 1
第二种代码的错误原因
嵌套循环逻辑完全错误:外层遍历每个词汇,内层遍历所有标记,相当于每个词汇会和所有标记逐一匹配,完全忽略了wofo和role的一一对应关系,导致统计逻辑混乱,最终无法得到正确结果。
修复后的第二种代码
lemma_met = {} lemma_ank = {} # 同时遍历词汇和对应标记,保证一一对应 for word, tag in zip(wofo, role): if tag == "Metapher": lemma_met[word] = lemma_met.get(word, 0) + 1 elif tag == "Anker": lemma_ank[word] = lemma_ank.get(word, 0) + 1
更简便的实现方式
方式一:用collections.defaultdict简化统计
from collections import defaultdict lemma_met = defaultdict(int) lemma_ank = defaultdict(int) for word, tag in zip(wofo, role): if tag == "Metapher": lemma_met[word] += 1 elif tag == "Anker": lemma_ank[word] += 1 # 可选:转为普通字典 lemma_met = dict(lemma_met) lemma_ank = dict(lemma_ank)
方式二:用collections.Counter直接统计
from collections import Counter # 筛选所有Metapher对应的词汇并统计 met_words = [word for word, tag in zip(wofo, role) if tag == "Metapher"] lemma_met = Counter(met_words) # 同理处理Anker ank_words = [word for word, tag in zip(wofo, role) if tag == "Anker"] lemma_ank = Counter(ank_words)
相关搜索关键词
- Python 列表对应元素统计
- Python 字典统计出现次数
- Python zip 遍历对应元素
- collections.defaultdict 用法
- collections.Counter 统计词汇
内容的提问来源于stack exchange,提问作者geraldine
相关产品推荐
相关产品推荐

