You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:20:25