Python如何按用户统计嵌套列表中True/False值的出现次数
用户布尔值统计实现方案
实现逻辑
- 遍历原始用户记录列表,忽略业务不需要的时间戳字段
- 以用户名为唯一维度做聚合,分别累计每个用户名下
True、False的出现次数 - 聚合完成后将字典格式的统计结果,转换为要求的「用户名、True计数值、False计数值」嵌套列表结构
可运行代码
版本1:使用defaultdict(写法更简洁)
from collections import defaultdict my_list = [ ['user1', True, '2022-05-31 05:35:48'], ['user2', False, '2022-04-26 00:01:12'], ['user3', True, '2022-03-09 14:14:12'], ['user3', False, '2022-02-28 09:19:48'], ['user5', False, '2022-02-07 18:41:48'] ] # 初始化统计字典,每个新用户默认True、False计数均为0 count_map = defaultdict(lambda: [0, 0]) for username, flag, _ in my_list: if flag: count_map[username][0] += 1 else: count_map[username][1] += 1 final_list = [[uname, true_num, false_num] for uname, (true_num, false_num) in count_map.items()]
运行后final_list的输出和预期完全一致:
[['user1', 1, 0], ['user2', 0, 1], ['user3', 1, 1], ['user5', 0, 1]]
版本2:无依赖纯原生实现
如果不想引入collections模块,用普通Python字典也可以实现完全相同的效果:
my_list = [ ['user1', True, '2022-05-31 05:35:48'], ['user2', False, '2022-04-26 00:01:12'], ['user3', True, '2022-03-09 14:14:12'], ['user3', False, '2022-02-28 09:19:48'], ['user5', False, '2022-02-07 18:41:48'] ] count_map = {} for username, flag, _ in my_list: # 首次遇到的用户先初始化计数 if username not in count_map: count_map[username] = [0, 0] count_map[username][0] += 1 if flag else 0 count_map[username][1] += 0 if flag else 1 final_list = [[uname, t_cnt, f_cnt] for uname, (t_cnt, f_cnt) in count_map.items()]
内容的提问来源于stack exchange,提问作者clovestamp
相关产品推荐
相关产品推荐

