Python文本行部分重复检测:如何输出全部重复行?
问题
需要检测文本文件中前3个字符重复的行,并输出所有符合条件的行。现有代码运行后少输出一行,请求修复。
原代码:
with open('file.txt') as f: seen = set() for line in f: line_lower = line[:3].lower() if line_lower in seen: print(line) else: seen.add(line_lower)
file.txt内容:
abcdef quopjsl abcasx qdxms abcsdc
当前输出结果:
abcasx abcsdc
期望输出结果:
abcdef abcasx abcsdc
修复方案
原代码的问题在于:仅当当前行的前缀已存在于seen集合时才输出该行,而第一个出现的前缀行(比如abcdef)因为首次遍历不在集合中,只会被加入集合而不会被输出,但它实际上属于前缀重复的行组,需要被包含在结果里。
修复思路是先统计所有行的前缀出现次数,再遍历所有行,输出前缀出现次数≥2的所有行:
修复后的代码(两次遍历文件)
from collections import defaultdict # 第一步:统计每个前缀的出现次数 prefix_counts = defaultdict(int) with open('file.txt') as f: for line in f: prefix = line[:3].lower() prefix_counts[prefix] += 1 # 第二步:遍历所有行,输出前缀出现次数≥2的行 with open('file.txt') as f: for line in f: prefix = line[:3].lower() if prefix_counts[prefix] >= 2: print(line, end='') # 用end=''避免重复换行,原行本身带换行符
修复后的代码(一次读取所有行)
如果不想两次打开文件,可以先把所有行存入列表:
from collections import defaultdict with open('file.txt') as f: lines = [line for line in f] prefix_counts = defaultdict(int) for line in lines: prefix = line[:3].lower() prefix_counts[prefix] += 1 for line in lines: prefix = line[:3].lower() if prefix_counts[prefix] >= 2: print(line, end='')
运行上述代码后,就能输出所有前3字符重复的行,包括第一个出现的目标行。
内容的提问来源于stack exchange,提问作者kng
相关产品推荐
相关产品推荐

