如何用 Python 精确提取每行中“去扩展名后唯一”的文件名

发布时间 - 2025-12-30 00:00:00    点击率:

本文详解如何正确处理多行管道分隔的文件名,逐行统计去除扩展名后的出现频次,仅保留出现恰好一次的原始文件名(含扩展名),并以相同格式输出。

在该挑战中,核心逻辑并非简单去重(set 去重会丢失频次信息),而是识别每行中“基础名(不含扩展名)出现次数为 1”的原始文件名。例如 wub.mp3|wub.txt|wub.png 去掉扩展名后均为 wub,出现 3 次 → 全部排除;而 quux.mp3|quux.txt|thud.mp3 中 quux 出现 2 次(排除两者),thud 出现 1 次(保留 thud.mp3)。

正确解法需两步:

  1. 按行分割,再按 | 拆分每行的文件名;
  2. 对每行内所有文件名执行:
      ✅ 提取基础名(filename.split('.')[0]);
      ✅ 统计各基础名的出现频次(推荐使用 collections.Counter);
      ✅ 筛选出频次为 1 的原始文件名;
      ✅ 按原顺序(非去重顺序!)拼接结果(注意:题目未要求保持输入顺序?但示例输出隐含保留原始位置顺序,故应遍历原列表筛选,而非依赖 Counter.keys())。

以下是健壮、可读性强的 Python 实现:

from collections import Counter

def find_unique_filenames(text):
    result = []
    for line in text.strip().split('\n'):
        if not line.strip():  # 跳过空行
            continue
        filenames = line.strip().split('|')
        # 提取所有基础名(不含扩展名)
        stems = [f.split('.')[0] for f in filenames]
        # 统计频次
        stem_count = Counter(stems)
        # 筛选:仅保留 stem 出现次数为 1 的原始 filename(保持原始顺序)
        unique_files = [f for f in filenames if stem_count[f.split('.')[0]] == 1]
        result.append('|'.join(unique_files))
    return '\n'.join(result)

# 测试验证
test_input = "foo.mp3|bar.txt|baz.mp3\nwub.mp3|wub.mp3|wub.mp3|wub.txt|wub.png\nquux.mp3|quux.txt|thud.mp3"
print(find_unique_filenames(test_input))

输出:

foo.mp3|bar.txt|baz.mp3
thud.mp3

✅ 关键点说明:

  • 使用 Counter(stems) 高效统计频次,避免手动字典计数;
  • 筛选时遍历原始 filenames 列表,确保输出顺序与输入一致(如 foo.mp3|bar.txt|baz.mp3 三者基础名均唯一,全部保留且顺序不变);
  • 不依赖 set 或 dict.keys(),避免无序或丢失重复项判断逻辑;
  • 显式处理空行,增强鲁棒性;
  • 每行独立处理,完全符合题目“no logic carries forward”要求。

⚠️ 注意事项:

  • 文件名严格为“纯字母数字 + 单个点 + 扩展名”,因此 split('.')[0] 安全可靠(无需正则或 os.path.splitext);
  • 若某行无任何唯一文件名(如全为 a.txt|a.log|b.json|b.xml),对应输出为空字符串(即该行留空),符合逻辑;
  • 行长度 ≤100 字符、总行数 ≤500,本实现时间复杂度为 O(N×M),完全满足性能要求。

掌握频次统计与条件筛选的组合,是处理此类“基于重复性过滤”问题的核心能力。


# python  # js  # json  # app 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何处理异常和错误?(Handler示例)  在Oracle关闭情况下如何修改spfile的参数  昵图网官方站入口 昵图网素材图库官网入口  大同网页,大同瑞慈医院官网?  Java解压缩zip - 解压缩多个文件或文件夹实例  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Linux系统命令中tree命令详解  Laravel如何使用查询构建器?(Query Builder高级用法)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel如何实现API资源集合?(Resource Collection教程)  如何用wdcp快速搭建高效网站?  javascript日期怎么处理_如何格式化输出  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Bootstrap CSS布局之列表  如何用IIS7快速搭建并优化网站站点?  详解Oracle修改字段类型方法总结  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何在建站宝盒中设置产品搜索功能?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Python高阶函数应用_函数作为参数说明【指导】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何解决hover在ie6中的兼容性问题  浅谈redis在项目中的应用  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何在阿里云高效完成企业建站全流程?  Laravel如何实现数据库事务?(DB Facade示例)  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何快速生成橙子建站落地页链接?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  详解MySQL数据库的安装与密码配置  高端建站三要素:定制模板、企业官网与响应式设计优化  动图在线制作网站有哪些,滑动动图图集怎么做?  网站优化排名时,需要考虑哪些问题呢?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  中山网站制作网页,中山新生登记系统登记流程?  如何快速生成ASP一键建站模板并优化安全性?