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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:15:31