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

Python中如何找出订阅多季节目的user_id与tv_program_code

解决方案:找出订阅多季的节目及用户ID

针对你的需求——从给定的元组列表中筛选出同一用户订阅超过1季的节目,并输出对应的user_id和tv_program_code,我整理了几种不同的实现方案,分别适用于不同场景:

方案1:基础字典统计法(无依赖,逻辑清晰)

这是最基础的实现方式,用字典记录每个(user_id, tv_program_code)组合对应的季数集合(避免同一季重复订阅的干扰),最后筛选出季数超过1的组合。

data = [(9600002, 42, 3), (9600001, 17, 3), (9600003, 11, 1), (9600002, 14, 5), (9600001, 17, 1), (9600003, 11, 4), (9600001, 17, 4), (9600001, 14, 3), (9600002, 42, 6), (9600002, 42, 1)]

# 初始化字典,键为(user_id, tv_program_code),值为该组合对应的季数集合
count_dict = {}
for user, program, season in data:
    key = (user, program)
    if key not in count_dict:
        count_dict[key] = set()
    count_dict[key].add(season)

# 筛选出季数>1的组合并输出
result = [key for key, seasons in count_dict.items() if len(seasons) > 1]
for user, program in result:
    print(f"{user} {program}")

如果你的数据中不会有同一用户同一节目的重复季数记录,也可以把集合换成计数器(每次加1),逻辑是一样的。

方案2:使用collections.defaultdict简化代码

用Python标准库的defaultdict可以省去手动判断键是否存在的步骤,让代码更简洁,核心逻辑和方案1一致。

from collections import defaultdict

data = [(9600002, 42, 3), (9600001, 17, 3), (9600003, 11, 1), (9600002, 14, 5), (9600001, 17, 1), (9600003, 11, 4), (9600001, 17, 4), (9600001, 14, 3), (9600002, 42, 6), (9600002, 42, 1)]

season_counter = defaultdict(set)
for user, program, season in data:
    season_counter[(user, program)].add(season)

# 筛选并输出结果
for (user, program), seasons in season_counter.items():
    if len(seasons) > 1:
        print(f"{user} {program}")

方案3:使用Pandas库(适合大数据量)

如果你的数据量比较大,或者需要处理结构化数据,用Pandas的分组统计会更高效,代码也更直观。

import pandas as pd

data = [(9600002, 42, 3), (9600001, 17, 3), (9600003, 11, 1), (9600002, 14, 5), (9600001, 17, 1), (9600003, 11, 4), (9600001, 17, 4), (9600001, 14, 3), (9600002, 42, 6), (9600002, 42, 1)]

# 转换为DataFrame结构
df = pd.DataFrame(data, columns=['user_id', 'tv_program_code', 'season_id'])

# 按用户和节目分组,统计唯一季数的数量
grouped = df.groupby(['user_id', 'tv_program_code'])['season_id'].nunique()

# 筛选出季数>1的记录并输出
result = grouped[grouped > 1].reset_index()
for _, row in result.iterrows():
    print(f"{row['user_id']} {row['tv_program_code']}")

Pandas的nunique()方法直接帮我们统计每个分组的唯一季数,非常适合批量处理数据。

方案4:使用itertools.groupby(需先排序)

itertools.groupby可以对数据进行分组,但要注意必须先按(user_id, tv_program_code)排序,否则分组会不准确,因为它只会把连续的相同键元素分到一组。

from itertools import groupby

data = [(9600002, 42, 3), (9600001, 17, 3), (9600003, 11, 1), (9600002, 14, 5), (9600001, 17, 1), (9600003, 11, 4), (9600001, 17, 4), (9600001, 14, 3), (9600002, 42, 6), (9600002, 42, 1)]

# 先按user_id和tv_program_code排序
sorted_data = sorted(data, key=lambda x: (x[0], x[1]))

# 分组并统计季数
for key, group in groupby(sorted_data, key=lambda x: (x[0], x[1])):
    seasons = {item[2] for item in group}
    if len(seasons) > 1:
        print(f"{key[0]} {key[1]}")

这种方法适合已经有序的数据集,或者可以接受排序开销的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:04:52