如何用 Python 精确提取每行中“扩展名去除后唯一出现”的文件名
技术百科
霞舞
发布时间:2025-12-30
浏览: 次 本文讲解如何正确处理按行分割的管道分隔文件列表,对每行独立去扩展名后统计原始文件名出现频次,仅保留频次为 1 的原始完整文件名(含扩展名),并用管道符重新拼接输出。
要解决该问题,关键在于理解题意中的“unique per row, ignoring the file extensions”——它不是指去重(distinct),而是指:在去除扩展名后,若某个基础名(如 wub、quux)在整个当前行中只出现一次,则保留其原始带扩展名的完整形式;若出现两次及以上,则整行中所有该基础名的文件均被剔除。
原代码错误地使用了 set,导致只记录了去重后的基础名,完全丢失了频次信息和原始文件名映射关系。正确做法是:
- 按行处理;
- 将每行按 | 分割为文件名列表;
- 对每个文件名提取基础名(filename.split('.')[0]);
- 使用 collections.Counter 统计每行中各基础名的出现次数;
- 遍历原始文件名列表,仅保留那些对应基础名计数为 1 的完整文件名;
- 将筛选后的文件名用 | 拼接成新行。
以下是修正后的完整 Python 实现:
from collections import Counter
def find_unique_filenames(text):
result = []
for line in text.strip().split('\n'):
if not lin
e.strip(): # 跳过空行
continue
filenames = line.strip().split('|')
# 提取每文件的基础名(不含扩展名)
basenames = [f.split('.')[0] for f in filenames]
# 统计基础名频次
basename_counts = Counter(basenames)
# 仅保留基础名出现恰好 1 次的原始文件名
unique_files = [
fname for fname in filenames
if basename_counts[fname.split('.')[0]] == 1
]
result.append('|'.join(unique_files))
return '\n'.join(result)
# 测试示例
test_input = """foo.mp3|bar.txt|baz.mp3
wub.mp3|wub.mp3|wub.mp3|wub.txt|wub.png
quux.mp3|quux.txt|thud.mp3"""
print(find_unique_filenames(test_input))✅ 输出结果:
foo.mp3|bar.txt|baz.mp3 thud.mp3
注意事项:
- 文件名严格为“纯字母数字 + 单个点 + 扩展名”,因此 split('.')[0] 安全可靠,无需正则;
- 每行独立处理,无状态依赖,适合流式读取大文件(可改用 for line in open(...) 迭代);
- 若某行所有基础名都重复(如第二行全为 wub),则输出为空行(符合题目逻辑);
- 保持原始顺序:我们遍历 filenames 列表而非 Counter 的键,确保输出顺序与输入一致。
该方案时间复杂度为 O(n),空间复杂度为 O(m)(m 为单行文件数),完全满足题目约束(≤500 行,≤100 字符/行)。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 企业SEO优化选择网站建设模板的技巧
- Python项目回滚策略_发布安全说明【指导】
- Win11摄像头无法使用怎么办_Win11相机隐私
- 如何减少Golang内存碎片化_Golang内存分
- 如何使用Golang处理网络超时错误_Golang
- php打包exe如何加密代码_防反编译保护方法【技
- Windows如何拦截腾讯视频广告_Windows
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何在 VS Code 中正确配置并使用 NumP
- c# await 一个已经完成的Task会发生什么
- Python文件操作优化_大文件与流处理解析【教程
- 如何使用Golang实现路由分组管理_Golang
- 获取 PHP 文件最后修改时间的正确方法
- Bpmn 2.0的XML文件怎么画流程图
- Win10怎么更改用户名 Win10修改账户名称操
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何解决Windows字体显示模糊的问题?(Cle
- PythonGIL机制理解_多线程限制解析【教程】
- Win11怎么激活Windows10_Win11激
- php本地部署支持nodejs吗_php与node
- Python 模块的 __name__ 属性如何由
- 如何使用Golang搭建本地API测试环境_快速验
- Win11怎么关闭自动修复_跳过Win11开机自动
- Drupal 中 HTML 链接被双重转义导致渲染
- Win11资源管理器卡顿怎么办 Win11文件资源
- Go 中的 := 运算符:类型推导机制与使用边界详
- php后缀怎么变mp4能播放_让php伪装mp4正
- Go语言中CookieJar的持久化机制解析:内存
- Windows怎样关闭锁屏广告_Windows关闭
- php订单日志权限怎么设_php订单日志文件权限设
- php怎么下载安装后设置错误日志_phpini l
- php修改数据怎么批量改状态_批量更新status
- Win11怎么关闭任务栏小组件_Windows11
- Win11怎么调整屏幕亮度_Windows 11调
- Windows10电脑怎么设置文件权限_Win10
- 本地php环境出现502错误_nginx或apac
- Mac上的iMovie如何剪辑视频?(新手入门教程
- php删除数据怎么清空表_truncate与del
- Windows10如何更改日期格式_Win10区域
- Python对象生命周期管理_创建销毁说明【指导】
- 如何使用Golang管理跨项目依赖_Golang多
- mac怎么退出id_MAC退出iCloud账号与A
- C#如何使用XPathNavigator高效查询X
- Windows10如何更改系统字体大小_Win10
- Win11无法识别耳机怎么办_解决Win11插耳机
- Win11任务栏怎么放到顶部_Win11修改任务栏
- 如何在JavaScript中动态拼接PHP的bas
- php中::能访问全局变量吗_全局作用域与类作用域
- c++23 std::expected怎么用 c+
- Win11 C盘满了怎么清理 Win11磁盘清理和

e.strip(): # 跳过空行
continue
filenames = line.strip().split('|')
# 提取每文件的基础名(不含扩展名)
basenames = [f.split('.')[0] for f in filenames]
# 统计基础名频次
basename_counts = Counter(basenames)
# 仅保留基础名出现恰好 1 次的原始文件名
unique_files = [
fname for fname in filenames
if basename_counts[fname.split('.')[0]] == 1
]
result.append('|'.join(unique_files))
return '\n'.join(result)
# 测试示例
test_input = """foo.mp3|bar.txt|baz.mp3
wub.mp3|wub.mp3|wub.mp3|wub.txt|wub.png
quux.mp3|quux.txt|thud.mp3"""
print(find_unique_filenames(test_input))
QQ客服