Python嵌套循环做文本替换时如何避免打印多余无效行?
问题原因
你的代码存在两个核心错误:
- 内层循环中每次都使用**原始未修改的
the_line**做单次替换,没有保留上一次替换的结果进行累加修改 print语句放在了内层循环中,每完成一个缩写的替换就打印一次,自然会输出216*20行的结果
修复后的代码
import pickle def main(): # 读取物种对照字典 with open('species_dict.pkl','rb') as handle: species_dict = pickle.load(handle) # 读取进化树文件 with open('Base_asr.tre','rt', encoding='utf-8') as f: tre_lines = f.readlines() # 逐行完成全部替换后输出 for line in tre_lines: processed_line = line # 所有替换操作都在上一次修改后的结果上执行 for abbr, full_name in species_dict.items(): processed_line = processed_line.replace(abbr, full_name) # 整行所有替换完成后再打印 print(processed_line, end='') # 加end=''避免重复换行,原行已自带换行符 if __name__ == '__main__': main()
可选优化说明
如果后续你新增的缩写存在短缩写包含在长缩写中的情况(例如同时有A和AB两个缩写),可以将缩写按长度从长到短排序后再替换,避免短缩写提前匹配长缩写中的字符,只需要修改内层循环的遍历逻辑即可:
for abbr, full_name in sorted(species_dict.items(), key=lambda x: len(x[0]), reverse=True): processed_line = processed_line.replace(abbr, full_name)
内容的提问来源于stack exchange,提问作者OnBorrowedLime
相关产品推荐
相关产品推荐

