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

