如何用Python itertools按嵌套列表末尾元素分组?解决分组异常
按子列表末尾元素分组的正确实现方法
用itertools.groupby的正确做法
itertools.groupby的核心特性是只对连续的相同键元素分组,你的原列表中末尾元素顺序是3、2、3、2,相同键的元素不连续,所以才会出现每个子列表单独成组的错误。要解决这个问题,需要先把列表按末尾元素排序,让相同键的元素连续,再执行分组操作。
代码示例:
import itertools l = [[15.0, 10265.0, 1860.0, 142600.0, 3], [12.0, 14631.0, 3298.0, 153100.0, 2], [22.0, 1707.0, 296.0, 126600.0, 3], [7.0, 1737.0, 290.0, 147000.0, 2]] # 先按子列表末尾元素排序,让相同键的元素连续 sorted_l = sorted(l, key=lambda x: x[-1]) # 按末尾元素分组 groups = [] for key, group in itertools.groupby(sorted_l, key=lambda x: x[-1]): groups.append(list(group)) print(groups) # 输出结果: # [[[12.0, 14631.0, 3298.0, 153100.0, 2], [7.0, 1737.0, 290.0, 147000.0, 2]], [[15.0, 10265.0, 1860.0, 142600.0, 3], [22.0, 1707.0, 296.0, 126600.0, 3]]]
其他实现方式(无需排序)
如果不想改变原列表的元素顺序,可以用字典手动分组,这种方式更灵活,不依赖元素的连续性:
方法1:用普通字典实现
l = [[15.0, 10265.0, 1860.0, 142600.0, 3], [12.0, 14631.0, 3298.0, 153100.0, 2], [22.0, 1707.0, 296.0, 126600.0, 3], [7.0, 1737.0, 290.0, 147000.0, 2]] group_dict = {} for item in l: key = item[-1] if key not in group_dict: group_dict[key] = [] group_dict[key].append(item) # 转换为目标列表格式 groups = list(group_dict.values()) print(groups) # 输出结果: # [[[15.0, 10265.0, 1860.0, 142600.0, 3], [22.0, 1707.0, 296.0, 126600.0, 3]], [[12.0, 14631.0, 3298.0, 153100.0, 2], [7.0, 1737.0, 290.0, 147000.0, 2]]]
方法2:用collections.defaultdict简化代码
from collections import defaultdict l = [[15.0, 10265.0, 1860.0, 142600.0, 3], [12.0, 14631.0, 3298.0, 153100.0, 2], [22.0, 1707.0, 296.0, 126600.0, 3], [7.0, 1737.0, 290.0, 147000.0, 2]] group_dict = defaultdict(list) for item in l: group_dict[item[-1]].append(item) groups = list(group_dict.values()) print(groups)
内容的提问来源于stack exchange,提问作者Aditi Kannan
相关产品推荐
相关产品推荐

