Python中如何为字典追加值而不覆盖已有值?(倒排索引场景)
解决字典值被覆盖,实现行号追加的问题
你的问题出在每次直接给字典key赋值单个行号,导致后续出现的相同单词会覆盖之前的行号。要实现将所有出现的行号存入列表,可通过以下两种方式修改代码:
方法1:使用普通字典 + setdefault 方法
def inverse_index(): my_dict = {} for count, line in enumerate(open('doc0.txt')): for word in line.split(): # 将单词转为小写,统一键的格式 lower_word = word.lower() # 若键不存在则创建空列表,存在则直接获取列表,随后追加行号 my_dict.setdefault(lower_word, []).append(count) print(my_dict)
方法2:使用 collections.defaultdict(更简洁)
from collections import defaultdict def inverse_index(): my_dict = defaultdict(list) for count, line in enumerate(open('doc0.txt')): for word in line.split(): lower_word = word.lower() # 访问不存在的键时会自动创建空列表,直接追加行号即可 my_dict[lower_word].append(count) # 如需转为普通字典输出,可使用 dict(my_dict) print(dict(my_dict))
关键说明
- 避免覆盖的核心:将每个键对应的取值从单个数字改为列表,每次循环时向列表追加行号,而非直接赋值。
- 大小写统一:通过
word.lower()将所有单词转为小写,确保"A"和"a"被识别为同一个键,匹配你给出的期望输出格式。 - 两种方法的区别:
setdefault是普通字典的内置方法,无需额外导入模块;defaultdict属于collections模块,会自动为不存在的键生成默认空列表,代码更简洁。
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

