按元组第二个元素聚合:数组去重合并与分组计数需求
分组聚合元组列表:去重合并数组+统计数量
需求说明
现有如下元组列表:
[ ('r', 'p', ['A', 'B']), ('r', 'f', ['A']), ('r', 'e', ['A']), ('r', 'p', ['A']), ('r', 'f', ['B']), ('r', 'p', ['B']), ('r', 'e', ['B']), ('r', 'c', ['A']) ]
需要按元组的第二个元素做分组,完成两个操作:
- 统计每组里有多少个元组
- 把每组里第三个元素的数组去重后合并成一个新数组
最终输出的每个元素是四元组:第一个元素固定为'r',第二个是分组的唯一值,第三个是去重合并后的数组,第四个是组内元组的数量。预期结果如下:
[ ('r', 'p', ['A', 'B'], 4), ('r', 'f', ['A', 'B'], 2), ('r', 'e', ['A', 'B'], 2), ('r', 'c', ['A'], 1) ]
实现方案
方法一:用字典手动分组(无需排序)
这种方法适合原列表无序的情况,直接遍历分组:
input_list = [ ('r', 'p', ['A', 'B']), ('r', 'f', ['A']), ('r', 'e', ['A']), ('r', 'p', ['A']), ('r', 'f', ['B']), ('r', 'p', ['B']), ('r', 'e', ['B']), ('r', 'c', ['A']) ] # 用字典存每个分组的信息:去重后的元素集合、计数 group_info = {} for _, key, arr in input_list: if key not in group_info: # 第一次碰到这个分组,初始化集合和计数 group_info[key] = {'elements': set(arr), 'count': 1} else: # 已有分组,合并数组元素到集合,计数加1 group_info[key]['elements'].update(arr) group_info[key]['count'] += 1 # 转成预期的元组列表,排序分组键保证顺序和预期一致 result = [('r', k, sorted(v['elements']), v['count']) for k, v in sorted(group_info.items())] print(result)
方法二:用itertools.groupby(需先排序)
groupby只会把连续相同键的元素归为一组,所以要先按分组键排序:
from itertools import groupby input_list = [ ('r', 'p', ['A', 'B']), ('r', 'f', ['A']), ('r', 'e', ['A']), ('r', 'p', ['A']), ('r', 'f', ['B']), ('r', 'p', ['B']), ('r', 'e', ['B']), ('r', 'c', ['A']) ] # 先按第二个元素排序,保证相同键的元素连续 sorted_list = sorted(input_list, key=lambda x: x[1]) result = [] for key, group in groupby(sorted_list, key=lambda x: x[1]): group_items = list(group) # 合并所有数组元素并去重 merged_elements = set() for item in group_items: merged_elements.update(item[2]) # 转成有序列表对齐预期输出 merged_list = sorted(merged_elements) # 构造结果元组 result.append(('r', key, merged_list, len(group_items))) print(result)
核心逻辑说明
- 用集合处理数组去重最方便,
update方法可以直接把一个数组的元素加到集合里,自动忽略重复值 - 两种方法都是先分组,再统计数量、合并去重元素,最后转成要求的格式
- 加
sorted是为了让结果里的分组顺序和数组元素顺序和预期一致,如果不需要固定顺序可以去掉
内容的提问来源于stack exchange,提问作者lolo
相关产品推荐
相关产品推荐

