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
相关产品推荐
相关产品推荐

