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

Python字典推导式统计字幕类型失效,仅特定多段写法正常求助

字幕文件类型统计异常的问题分析与解决

问题场景

我需要统计文件夹内字幕文件的类型分布,写了三种统计逻辑,通过countType参数切换执行:

  • oneLiner:字典推导式实现,代码如下:
    subtitle_counter = {sub.rsplit(".",1)[-1]: self.subList.count(sub.rsplit(".",1)[-1]) for sub in self.subList}
    
  • Multi-line_1:先将完整文件名存入splitted_subs,再循环拆分扩展名并统计
  • Multi-line_2:先拆分文件名提取扩展名存入splitted_subs,再循环统计

实际运行后,只有Multi-line_2能输出正确结果:{'srt': 2, 'idx': 2, 'sub': 2},前两种方式都返回{'srt': 0, 'idx': 0, 'sub': 0}。

失效原因

调试后发现问题的核心是统计时用错了目标列表:

  • oneLiner中,self.subList.count(sub.rsplit(".",1)[-1])是在统计「扩展名字符串」在self.subList(存储完整文件名的列表)中的出现次数——显然完整文件名里不会存在单独的扩展名,所以每次计数都是0。
  • Multi-line_1的逻辑类似:先存储了完整文件名,后续拆分扩展名后,仍然错误地在原文件名列表(而非扩展名列表)中统计,自然找不到匹配项。
  • 而Multi-line_2是先把所有扩展名提取出来存入splitted_subs,统计时直接在这个纯扩展名列表里计数,因此能得到正确结果。

修正后的代码

修正字典推导式写法

先提取所有扩展名到单独列表,再基于这个列表统计:

# 先提取所有扩展名
extensions = [sub.rsplit(".", 1)[-1] for sub in self.subList]
# 基于扩展名列表统计,用set去重避免重复计数
subtitle_counter = {ext: extensions.count(ext) for ext in set(extensions)}

更高效的实现(用collections.Counter)

Python标准库的Counter专门用来做频次统计,代码更简洁高效:

from collections import Counter

extensions = [sub.rsplit(".", 1)[-1] for sub in self.subList]
subtitle_counter = Counter(extensions)

总结

统计元素频次时,必须确保统计目标和统计列表的元素类型一致:要统计扩展名的数量,就得在由扩展名组成的列表里计数,而不是在原文件名列表中查找扩展名的出现次数。

内容的提问来源于stack exchange,提问作者DeDifferentOne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:35:16