如何交换Python字典键值对避免逐字符遍历?附文件读写需求
解决方法:读取文本生成字典并交换键值对(无模块导入)
问题根源拆解
- 第一种错误(值被拆成单个字符):大概率是你错误地把原字典里的技能字符串当作可迭代对象遍历了,比如循环逐个取字符当新字典的键,或者赋值时误操作拆分了字符串,导致每个字符单独成了映射项。
- 第二种错误(ValueError):直接用
for k, v in original_dict遍历字典的话,默认只会拿到键(也就是职业字符串),一个字符串没法拆成两个变量,自然触发“too many values to unpack”的报错。
正确实现代码
# 读取原文件,整理初始数据 original_data = {} with open('input.txt', 'r') as f: for line in f: line = line.strip() if not line: continue # 只按第一个冒号分割,避免值里有冒号时出错 job, skill = line.split(':', 1) # 去掉技能末尾的多余逗号(处理Leather那行的Stitching,) skill = skill.rstrip(',') original_data[job] = skill # 交换键值对,用列表收集同技能的多个职业 reversed_dict = {} for job, skill in original_data.items(): if skill not in reversed_dict: reversed_dict[skill] = [] reversed_dict[skill].append(job) # 写入新文件 with open('output.txt', 'w') as f: for skill, jobs in reversed_dict.items(): # 格式化成期望的输出样式 output_line = f"{skill}: {', '.join(jobs)}\n" f.write(output_line)
关键步骤解释
文件读取与预处理:
strip()去除每行的换行符和首尾空白,跳过空行避免干扰。split(':', 1)确保只分割第一个冒号,哪怕以后值里出现冒号也不会出错。rstrip(',')专门处理原文件中Leather:Stitching,末尾的多余逗号,保证技能名称干净统一。
键值对交换逻辑:
- 新字典
reversed_dict的键是技能,值用列表存储职业,这样同一个技能对应的多个职业可以被收集起来,不会被覆盖,也不会拆成单个字符。 - 必须用
items()遍历原字典,才能同时拿到完整的职业和技能字符串,不会出现拆分错误。
- 新字典
输出格式化:
- 用
', '.join(jobs)把职业列表转成逗号分隔的字符串,完全匹配你要的输出格式。
- 用
对应你两种错误的具体说明
- 第一种错误:如果之前的代码是
for job, skill in original_data.items(): reversed_dict[skill] = job,后面的同技能职业会覆盖前面的;要是写成for char in skill: reversed_dict[char] = job,就会把技能拆成单个字符当键,这就是你看到逐字符映射的原因。 - 第二种错误:直接遍历字典(
for k, v in original_data)只会拿到职业字符串,比如"Cloth",尝试把这个字符串拆成k和v两个变量,自然会报错,因为字符串长度远大于2,没法拆分。
内容的提问来源于stack exchange,提问作者Fendewen
相关产品推荐
相关产品推荐

