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

如何在已按首元素排序的元组列表中按次元素排序重复项

解决方案

你可以通过分组排序的方式实现需求:利用原列表已按首元素排序的特性,将相同首元素的项划为一组,仅对每组内部按次元素排序,最后保留各组原有顺序拼接即可。

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:20:29