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

如何对list of list of tuple按元组前缀进行分组

按元组前缀分组嵌套列表的实现方案

问题说明

给定嵌套列表:

lst = [[1, 4, (1, 1, 1, 4)], [7,8,(2, 1,6, 14)],[2,3, (1, 1, 1, 9)], [5,4, (2, 1,1, 12)], [8,9, (2, 1,1, 99)],  [5,7,(2, 1,6, 19)], [3,4, (1, 1, 1, 14)]]

要求将末尾元组仅最后一项不同的子列表归为同一组,即元组前n-1项相同的子列表分到一组,预期分组结果如下:

first group: [[1, 4, (1, 1, 1, 4)], [2,3, (1, 1, 1, 9)], [3,4, (1, 1, 1, 14)]]
second group: [[5,4, (2, 1,1, 12)], [8,9, (2, 1,1, 99)]]
third group: [[7,8,(2, 1,6, 14)], [5,7,(2, 1,6, 19)]]

两种实现方法

方法一:普通字典分组

这是最直观的实现方式,利用字典的键唯一性来分组:

lst = [[1, 4, (1, 1, 1, 4)], [7,8,(2, 1,6, 14)],[2,3, (1, 1, 1, 9)], [5,4, (2, 1,1, 12)], [8,9, (2, 1,1, 99)],  [5,7,(2, 1,6, 19)], [3,4, (1, 1, 1, 14)]]

groups = {}
for item in lst:
    # 提取元组的前n-1项作为分组键
    group_key = item[2][:-1]
    # 键不存在则初始化空列表,再添加当前子列表
    groups.setdefault(group_key, []).append(item)

# 将字典的值转为列表,得到最终分组结果
final_groups = list(groups.values())
print(final_groups)

执行后输出:

[[[1, 4, (1, 1, 1, 4)], [2, 3, (1, 1, 1, 9)], [3, 4, (1, 1, 1, 14)]], [[7, 8, (2, 1, 6, 14)], [5, 7, (2, 1, 6, 19)]], [[5, 4, (2, 1, 1, 12)], [8, 9, (2, 1, 1, 99)]]]

方法二:使用itertools.groupby

itertools.groupby是Python标准库中的分组工具,但需要先按分组键排序,否则会出现同一组分散的情况:

from itertools import groupby

lst = [[1, 4, (1, 1, 1, 4)], [7,8,(2, 1,6, 14)],[2,3, (1, 1, 1, 9)], [5,4, (2, 1,1, 12)], [8,9, (2, 1,1, 99)],  [5,7,(2, 1,6, 19)], [3,4, (1, 1, 1, 14)]]

# 先按元组前n-1项排序,确保同组元素连续
sorted_list = sorted(lst, key=lambda x: x[2][:-1])
# 按分组键聚合元素
final_groups = [list(group) for _, group in groupby(sorted_list, key=lambda x: x[2][:-1])]

print(final_groups)

输出结果与方法一完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:10:27