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

基于排序列表构建两个字典的Python代码续写求助

问题:基于排序列表生成词频索引与文档频率字典

给定一个形如(string, id)的排序列表,需要生成两个字典:

  • 第一个字典存储每个词在不同文档中的出现频率,格式为{term: [(id, term_frequency), ...]},示例:{"car": [(1, 1), (2, 2)], "book": [(1, 1)], "banana": [(3, 1)]}
  • 第二个字典统计每个词对应的唯一文档id数量,示例:{"car": 2, "book": 1, "banana": 1}

现有代码在字典更新逻辑上受阻,请求指导续写,现有代码如下:

input_list = [("car", 1), ("car", 2), ("car", 2), ("book", 1), ("banana", 3)]
def get_index(list):
    index = {}
    doc_freq = {}
    
    index = 0
    
    while(index < len(list)):
        (term, doc_id) = list[index]
        index[term] = [(doc_id, 1)]
    # 此处无法继续
    
    for(term, value) in index.items():
        doc_freq[term] = len(value)
        

    return index, doc_freq

修正后的代码与逻辑说明

现有代码的问题

  1. 变量名冲突:index同时被用作字典和循环计数器,导致逻辑混乱
  2. 未处理频率累加:每次循环都直接覆盖index[term],没有对相同文档id的词频进行累加,也没有处理相同词不同文档的情况

修正后的完整代码

input_list = [("car", 1), ("car", 2), ("car", 2), ("book", 1), ("banana", 3)]
def get_index(input_list):
    index = {}
    doc_freq = {}
    
    i = 0
    while i < len(input_list):
        term, doc_id = input_list[i]
        
        if term not in index:
            # 词首次出现,初始化列表
            index[term] = [(doc_id, 1)]
        else:
            # 词已存在,检查最后一条记录的文档id是否匹配
            last_doc, last_count = index[term][-1]
            if last_doc == doc_id:
                # 同一文档,累加频率
                index[term][-1] = (last_doc, last_count + 1)
            else:
                # 不同文档,添加新条目
                index[term].append((doc_id, 1))
        i += 1
    
    # 生成文档频率字典
    for term, entries in index.items():
        doc_freq[term] = len(entries)
    
    return index, doc_freq

# 测试调用
term_index, doc_frequency = get_index(input_list)
print("词频索引:", term_index)
print("文档频率:", doc_frequency)

关键逻辑解释

  1. 变量名修正:把循环计数器改为i,避免和存储索引的字典index冲突
  2. 词频累加逻辑:
    • 当词首次出现时,直接在index中创建对应的列表,初始值为[(doc_id, 1)]
    • 当词已存在时,由于输入是排序列表,相同词的相同文档id会连续出现,因此只需检查列表最后一条记录的文档id:
      • 如果和当前id一致,就把该条目的频率加1
      • 如果不一致,说明是新的文档,添加新的(doc_id, 1)条目
  3. 文档频率生成:直接取每个词对应的条目列表长度,就是该词对应的唯一文档id数量

运行后输出结果:

词频索引: {'car': [(1, 1), (2, 2)], 'book': [(1, 1)], 'banana': [(3, 1)]}
文档频率: {'car': 2, 'book': 1, 'banana': 1}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:36:16