如何基于元组列表构建以词干为键、对应衍生词列表为值的字典?
解决词干到单词列表的字典转换问题
我来帮你搞定这个需求!你的目标是把一个包含(单词, 词干)的元组列表,转换成以词干为键、对应单词列表为值的字典。原来的代码逻辑有几个关键问题,我一步步给你梳理并修正:
原代码的问题分析
- 遍历方式错误:你用
for index, tuple in tuple_list会把每个元组的第一个元素当成index,第二个当成tuple,但实际上每个元组是(单词, 词干),应该拆成word, stem来遍历。 - 无意义的判断:
if tuple == same_words这段完全无效——你既没定义same_words,也不是判断词干是否存在字典里的正确方式。 - 字典操作错误:字典不能用
+=来添加元素,得针对键来操作列表。
正确实现方式
方式一:基础循环判断
这是最直观的写法,手动处理键的存在性:
# 示例输入 tuple_list = [('remarkably','remark'),('prevented','prevent'), ('achieved','achiev'), ('achieve','achiev'), ('accidentally','accident'), ('accidental','accident')] stem_dict = {} for word, stem in tuple_list: # 检查词干是否已在字典中 if stem in stem_dict: # 存在则追加单词到对应列表 stem_dict[stem].append(word) else: # 不存在则新建键值对,值为包含当前单词的列表 stem_dict[stem] = [word] print(stem_dict)
运行后会得到你想要的输出:
{'remark': ['remarkably'], 'prevent': ['prevented'], 'achiev': ['achieved', 'achieve'], 'accident': ['accidentally', 'accidental']}
方式二:用collections.defaultdict简化代码
如果不想手动判断键是否存在,可以用Python标准库的defaultdict,它会自动为不存在的键创建空列表:
from collections import defaultdict # 示例输入 tuple_list = [('remarkably','remark'),('prevented','prevent'), ('achieved','achiev'), ('achieve','achiev'), ('accidentally','accident'), ('accidental','accident')] stem_dict = defaultdict(list) for word, stem in tuple_list: # 直接追加,无需判断键是否存在 stem_dict[stem].append(word) # 可选:如果需要转换成普通字典(defaultdict是dict的子类,大部分场景不需要转换) stem_dict = dict(stem_dict) print(stem_dict)
这种写法更简洁,适合处理这类需要自动初始化值的字典场景。
内容的提问来源于stack exchange,提问作者Ace




