Python:基于最大差值筛选子列表的实现方法
解决方法:按第二个元素分组,保留每组目标子列表
这需求很好实现,核心就是以子列表的第二个元素作为分组依据,只保留每个分组里的第一个条目(或是差值最大的条目,适配不同场景)。我给你两种Python实现方案:
方案1:适用于原始列表已按分组顺序排列(如你的例子)
如果你的原始列表已经是同一组的子列表连续排列,且每组第一个就是差值最大的,用一个集合跟踪已处理的分组键就行,简单高效:
original_list = [[0, 3], [1, 3], [2, 3], [314, 335], [315, 335], [316, 335], [317, 335], [318, 335], [319, 335], [320, 335], [321, 335], [322, 335], [323, 335], [324, 335], [325, 335], [326, 335], [327, 335], [328, 335], [329, 335], [330, 335], [331, 335], [332, 335], [333, 335], [334, 335], [645, 647], [646, 647]] seen_groups = set() filtered_result = [] for sublist in original_list: group_key = sublist[1] if group_key not in seen_groups: filtered_result.append(sublist) seen_groups.add(group_key) print(filtered_result) # 输出:[[0, 3], [314, 335], [645, 647]]
逻辑说明:
seen_groups集合用来记录已经处理过的分组键(也就是子列表的第二个元素),避免重复添加同一组的条目。- 遍历原始列表时,只要当前子列表的分组键不在集合里,就把它加入结果列表,同时把键存入集合;已经存在的键直接跳过,完美保留每组第一个出现的子列表。
方案2:适用于原始列表无序,需确保保留差值最大的子列表
如果你的原始列表不是按分组顺序排列,或者不确定每组第一个是不是差值最大的,那可以先分组再排序,确保拿到每组差值最大的条目:
from itertools import groupby original_list = [[0, 3], [1, 3], [2, 3], [314, 335], [315, 335], [316, 335], [317, 335], [318, 335], [319, 335], [320, 335], [321, 335], [322, 335], [323, 335], [324, 335], [325, 335], [326, 335], [327, 335], [328, 335], [329, 335], [330, 335], [331, 335], [332, 335], [333, 335], [334, 335], [645, 647], [646, 647]] # 先按分组键(第二个元素)排序,保证groupby能正确分组 sorted_list = sorted(original_list, key=lambda x: x[1]) # 按第二个元素分组 groups = groupby(sorted_list, key=lambda x: x[1]) filtered_result = [] for key, group in groups: # 把每组的子列表按「第二个元素-第一个元素」的差值降序排序,取第一个(差值最大的) sorted_group = sorted(group, key=lambda x: -(x[1] - x[0])) filtered_result.append(sorted_group[0]) print(filtered_result)
逻辑说明:
itertools.groupby需要列表先按分组键排序,所以第一步先对原始列表排序。- 对每个分组内的子列表,按差值(
x[1]-x[0])降序排列,这样第一个元素就是该组差值最大的,直接加入结果列表。
两种方案都能满足你的需求,根据原始列表的实际情况选择就行~
内容的提问来源于stack exchange,提问作者DaxHR
相关产品推荐
相关产品推荐

