如何在已按首元素排序的元组列表中按次元素排序重复项
解决方案
你可以通过分组排序的方式实现需求:利用原列表已按首元素排序的特性,将相同首元素的项划为一组,仅对每组内部按次元素排序,最后保留各组原有顺序拼接即可。
方法1:使用itertools.groupby
itertools.groupby能快速将连续的相同键元素分组(因为原列表已按首元素排序,相同首元素的项是连续的),再对每组内部排序:
import itertools # 已按首元素排序的原列表 sorted_list = [(1, 'e'), (2, 'd'), (3, 'c'), (3, 'a'), (3, 'b'), (4, 'f')] result = [] # 按元组首元素分组 for key, group in itertools.groupby(sorted_list, key=lambda x: x[0]): # 每组内按次元素排序后加入结果 sorted_group = sorted(group, key=lambda x: x[1]) result.extend(sorted_group) print(result) # 输出: [(1, 'e'), (2, 'd'), (3, 'a'), (3, 'b'), (3, 'c'), (4, 'f')]
方法2:手动遍历分组
如果不想引入额外库,可以手动遍历列表完成分组与排序:
sorted_list = [(1, 'e'), (2, 'd'), (3, 'c'), (3, 'a'), (3, 'b'), (4, 'f')] result = [] current_key = None current_group = [] for item in sorted_list: # 遇到新的首元素时,处理上一组 if item[0] != current_key: if current_group: result.extend(sorted(current_group, key=lambda x: x[1])) current_group = [] current_key = item[0] current_group.append(item) # 处理最后一组未加入的元素 if current_group: result.extend(sorted(current_group, key=lambda x: x[1])) print(result) # 输出: [(1, 'e'), (2, 'd'), (3, 'a'), (3, 'b'), (3, 'c'), (4, 'f')]
两种方法都能保证不同首元素的项保持原有排序,仅对同首元素的组内按次元素排序。
内容的提问来源于stack exchange,提问作者Ebenezer
相关产品推荐
相关产品推荐

