如何对元组列表按第二个元素降序排序且相同元素元组相邻?
元组列表按指定规则排序的实现方法
从给出的预期结果分析,排序逻辑分为两层:
- 所有第二个元素相同的元组必须相邻;
- 分组顺序为
A组在前,B组次之,C组最后; - 每组内的元组按第一个元素降序排列。
以下是几种符合需求的实现方式:
方法1:基于字母升序的分组排序
直接使用Python内置的sorted()函数,通过key参数指定复合排序规则:
- 先按元组的第二个元素升序排列,确保同组元组相邻;
- 再按第一个元素的负值升序,等价于按第一个元素本身降序。
original_list = [(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')] sorted_list = sorted(original_list, key=lambda x: (x[1], -x[0])) print(sorted_list) # 输出结果:[(80, 'A'), (10, 'A'), (5, 'A'), (50, 'B'), (30, 'B'), (40, 'C')]
方法2:基于出现次数降序的分组排序
如果分组顺序是由第二个元素的出现频率决定(A出现3次最多,B2次,C1次),可以借助collections.Counter统计次数后排序:
from collections import Counter original_list = [(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')] counts = Counter(item[1] for item in original_list) # 排序规则:先按出现次数降序,再按字母升序,最后按第一个元素降序 sorted_list = sorted(original_list, key=lambda x: (-counts[x[1]], x[1], -x[0])) print(sorted_list) # 输出结果与预期一致
方法3:自定义元素优先级的降序排序
如果需要指定第二个元素的自定义降序顺序(比如强制A > B > C),可以为每个元素分配优先级值,再按优先级降序排序:
original_list = [(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')] priority_map = {'A': 3, 'B': 2, 'C': 1} sorted_list = sorted(original_list, key=lambda x: (-priority_map[x[1]], -x[0])) print(sorted_list) # 输出结果与预期一致
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

