
当文件中存在重复单词时,使用字典推导式会因键冲突导致仅保留最后一次出现的行号;正确做法是用defaultdict(list)或普通字典手动累积所有行号,从而支持“一词多号”的双向查询需求。
在原始代码中:
word_to_number = {word: int(num) for num, word in map(str.split, file)}字典推导式本质上等价于逐个赋值:word_to_number[word] = int(num)。由于字典的键(如 "fire")必须唯一,后一次赋值(3 → "fire")会直接覆盖前一次(1 → "fire"),最终只保留 {"fire": 3, "water": 2, "earth": 4, "light": 6} —— 这正是问题根源。
✅ 正确解法:为每个单词存储所有对应行号的列表
推荐使用 collections.defaultdict(list),它能自动初始化缺失键为空列表,避免手动判断:
from collections import defaultdict
word_to_number = defaultdict(list)
with open(file, "r") as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 2: # 防御性检查:跳过空行或格式异常行
num, word = parts[0], parts[1]
word_to_number[word].append(int(num))运行后,word_to_number["fire"] 返回 [1, 3],word_to_number["light"] 返回 [5, 6],完美保留全部映射关系。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 若需反向查询(如“第3行是什么词?”),建议额外构建一个独立的 line_number_to_word 字典(键为整数行号,值为对应单词),因为行号在此场景中天然唯一;
- 不要混用 int(num) 和 num 字符串——确保类型统一(此处行号应为 int,便于数值比较与排序);
- 使用 strip() 防止换行符干扰 split(),提升鲁棒性。
? 扩展提示:若后续需快速查找“某行号对应的单词”,可同步构建反向映射:
line_to_word = {}
with open(file, "r") as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 2:
num, word = int(parts[0]), parts[1]
line_to_word[num] = word # 如 line_to_word[3] → "fire"这样,你就能同时支持「词→所有行号」和「行号→词」两类高效查询。










