Python类结合文本文件实现收视统计问题求助
问题解答
你的思路(用list存*再用count()统计)是可行的,但效率很低——每一条收视记录都存一个*,数据量大的时候会占用大量内存,而且统计时还要遍历整个list计数,不如直接用整数计数器更高效。下面给你一套落地的方案:
1. 调整Program类
把viewers改成整数计数器(默认0),没必要用list:
class Program: def __init__(self, channel, start, end, name, viewers=0, percentage=0.0): self.channel = channel self.start = start self.end = end self.name = name self.viewers = viewers # 用整数存切换次数,比list高效太多 self.percentage = percentage
2. 处理收视数据文件的步骤
假设你的收视数据分隔线是类似---的标识(如果不是,替换成实际分隔符即可),按以下步骤处理:
第一步:统计核心数据
- 电视总数:数分隔线的数量+1(比如n条分隔线对应n+1台设备)
- 各频道切换次数:每读到一条对应频道的收视记录,就给该Program实例的
viewers加1 - 总收视记录数:用于计算占比
代码示例:
# 先把节目单的Program实例存到字典,方便快速查找 channel_map = {program.channel: program for program in all_programs} total_records = 0 tv_count = 1 # 默认至少1台设备 # 读取收视数据文件 with open('收视数据.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue # 判断是否是设备分隔线 if line == '---': tv_count += 1 continue # 拆分时间和频道 _, channel = line.split('/') # 时间暂时用不到,直接忽略 channel = channel.strip() # 如果频道在节目单里,统计次数 if channel in channel_map: channel_map[channel].viewers += 1 total_records += 1
第二步:计算收视占比
遍历所有Program实例,用切换次数除以总记录数得到百分比:
for program in all_programs: if total_records == 0: program.percentage = 0.0 else: program.percentage = (program.viewers / total_records) * 100
第三步:生成Top10榜单
按切换次数降序排序,取前10;如果次数相同,可以按频道名排序保证结果稳定:
# 排序规则:先按切换次数降序,再按频道名字母序升序 top10_programs = sorted(all_programs, key=lambda x: (-x.viewers, x.channel))[:10]
3. 输出结果
直接打印统计数据和Top10即可:
print(f"电视总数:{tv_count}台") print("\n各频道收视统计:") for p in all_programs: print(f"频道{p.channel}《{p.name}》:切换次数{p.viewers},收视占比{p.percentage:.2f}%") print("\nTop10收视榜单:") for rank, p in enumerate(top10_programs, 1): print(f"{rank}. 频道{p.channel}《{p.name}》:切换次数{p.viewers},收视占比{p.percentage:.2f}%")
补充说明
如果你的“切换次数”指的是频道间的切换动作次数(比如从A换到B算1次切换),而不是频道被选中的次数,那需要额外处理:遍历每个设备的收视序列,对比相邻两条记录的频道,不同则计数+1,最后按频道统计被切换到的次数。这种情况可以在处理每个设备的行时,记录上一个频道,再做判断。
内容的提问来源于stack exchange,提问作者Ella
相关产品推荐
相关产品推荐

