




本文讲解如何正确构建单词到行号的多对一映射字典,解决因字典键重复导致旧值被覆盖的问题,使用 `defaultdict(list)` 实现每个单词对应全部出现位置。
在处理带编号的词汇文件(如 1 fire、3 fire)时,若直接用字典推导式 {word: int(num) for num, word in ...},由于字典键(即单词)不可重复,后出现的键值对会无条件覆盖先前同名键的值——例如 fire 最终只保留 3,而丢失 1。这显然违背了“记录单词所有出现位置”的需求。
正确做法是将每个单词映射为行号列表,而非单个数字。推荐使用 collections.defaultdict(list),它能自动为新键初始化空列表,避免手动检查键是否存在:
from collections import defaultdict word_to_number = defaultdict(list) with open(file,"r") as f: for line in f: line = line.strip() if not line: # 跳过空行 continue parts = line.split() if len(parts) < 2: continue # 跳过格式异常行 num_str, word = parts[0], " ".join(parts[1:]) # 兼容单词含空格(如 "north wind") word_to_number[word].append(int(num_str))
✅ 优势说明:
⚠️ 注意事项:
总结:当数据存在“一词多址”语义时,拒绝用普通字典覆盖式赋值;拥抱 defaultdict(list) 或手动初始化 dict.setdefault(key, []).append(value),这是构建多值映射的Python标准实践。