You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

关键说明

  1. 避免覆盖的核心:将每个键对应的取值从单个数字改为列表,每次循环时向列表追加行号,而非直接赋值。
  2. 大小写统一:通过 word.lower() 将所有单词转为小写,确保"A"和"a"被识别为同一个键,匹配你给出的期望输出格式。
  3. 两种方法的区别:
    • setdefault 是普通字典的内置方法,无需额外导入模块;
    • defaultdict 属于 collections 模块,会自动为不存在的键生成默认空列表,代码更简洁。

内容的提问来源于stack exchange,提问作者Connor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:15:34