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

