基于排序列表构建两个字典的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
修正后的代码与逻辑说明
现有代码的问题
- 变量名冲突:
index同时被用作字典和循环计数器,导致逻辑混乱 - 未处理频率累加:每次循环都直接覆盖
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)
关键逻辑解释
- 变量名修正:把循环计数器改为
i,避免和存储索引的字典index冲突 - 词频累加逻辑:
- 当词首次出现时,直接在
index中创建对应的列表,初始值为[(doc_id, 1)] - 当词已存在时,由于输入是排序列表,相同词的相同文档id会连续出现,因此只需检查列表最后一条记录的文档id:
- 如果和当前id一致,就把该条目的频率加1
- 如果不一致,说明是新的文档,添加新的
(doc_id, 1)条目
- 当词首次出现时,直接在
- 文档频率生成:直接取每个词对应的条目列表长度,就是该词对应的唯一文档id数量
运行后输出结果:
词频索引: {'car': [(1, 1), (2, 2)], 'book': [(1, 1)], 'banana': [(3, 1)]} 文档频率: {'car': 2, 'book': 1, 'banana': 1}
内容的提问来源于stack exchange,提问作者rusttree
相关产品推荐
相关产品推荐

