Python实现单词与对应笔记ID映射及现有代码质量优化咨询
解答
1. 生成单词与笔记ID映射列表的实现方案
不需要依赖已生成的word_list,可以直接遍历note_list一次性完成词频统计和笔记ID映射,代码如下:
import re from collections import defaultdict # 初始化映射存储,用set自动去重同一个笔记中多次出现的同个单词 word_note_ids = defaultdict(set) word_freq = defaultdict(int) for note in note_list: current_id = note["note_id"] # 统一转小写,同时提取纯单词自动过滤标点、特殊符号 words = re.findall(r"\b[a-zA-Z]+\b", note["note_txt"].lower()) for word in words: word_freq[word] += 1 word_note_ids[word].add(current_id) # 转换成你需要的目标结构 maped_list = [ {"word": word, "notes_ids": sorted(list(ids))} for word, ids in word_note_ids.items() ] # 按出现的笔记数量倒序排列,和你给出的示例顺序一致 maped_list.sort(key=lambda x: len(x["notes_ids"]), reverse=True) # 如果需要同步生成你之前的word_list,也可以直接生成 word_list = [ {"word": word, "repeted": cnt} for word, cnt in word_freq.items() ] word_list.sort(key=lambda x: x["repeted"], reverse=True)
2. 现有代码的优化建议
- 命名规范问题:不要用
dict作为变量名,它是Python内置的关键字,会覆盖原生字典类型的方法,容易引发未知bug;notes_test命名语义不清晰,建议改成all_note_text这类符合实际用途的名称;统计次数的字段名repeted拼写错误,正确拼写是repeated。 - 语法错误问题:你现有代码中
for note in note_list:下的append行没有缩进,直接运行会抛出语法错误。 - 单词拆分逻辑问题:用
re.split('\s', sentence)仅按空格拆分单词,无法处理标点、大小写差异问题,比如笔记中的teach,会被识别为带逗号的单词,大写的Python会被判定和python是不同单词,和你的示例结果不匹配,建议用re.findall提取纯单词+统一转小写处理。 - 代码简洁度问题:用
try-except捕获KeyError统计词频是可行的,但用collections.defaultdict可以省略异常捕获的逻辑,代码更简洁易读。 - 效率问题:你现有代码分两次遍历(第一次收集所有笔记文本、第二次统计词频),如果后续还要生成映射需要第三次遍历,数据量大的时候性能损耗明显,建议直接单次遍历
note_list同时完成所有统计逻辑。 - 代码简化问题:最终生成
word_list的循环可以替换为列表推导式,减少冗余代码。
内容的提问来源于stack exchange,提问作者Maria Moulinka
相关产品推荐
相关产品推荐

