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

按元组第二个元素聚合:数组去重合并与分组计数需求

分组聚合元组列表:去重合并数组+统计数量

需求说明

现有如下元组列表:

[
('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'])
]

需要按元组的第二个元素做分组,完成两个操作:

  1. 统计每组里有多少个元组
  2. 把每组里第三个元素的数组去重后合并成一个新数组
    最终输出的每个元素是四元组:第一个元素固定为'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:50:40