如何按出现次数降序并关联逆序子列表对列表的列表排序?
问题
给定列表:
list_55 = [[1,2],[2,1],[3,4],[5,6],[4,3],[1,2],[1,2],[6,5],[6,5]]
需要按以下规则排序:
- 按子列表的出现次数降序排列
- 每个子列表与其逆序子列表放在一起(例如
[1,2]的所有实例后紧跟[2,1])
期望输出:
[[1,2],[1,2],[1,2],[2,1],[6,5],[6,5],[5,6],[4,3],[3,4]]
已尝试的代码及结果:
- 按出现次数排序:
sorted(list_55, key=list_55.count, reverse=True)
结果:
[[1, 2], [1, 2], [1, 2], [6, 5], [6, 5], [2, 1], [3, 4], [5, 6], [4, 3]]
- 直接逆序排序:
sorted(list_55,reverse=True)
结果:
[[6, 5], [6, 5], [5, 6], [4, 3], [3, 4], [2, 1], [1, 2], [1, 2], [1, 2]]
需要结合两种排序效果,实现符合要求的排序。
解决方案
可以通过设计多层优先级的排序key,同时满足「总出现次数降序」和「子列表与逆序同组」的需求,具体实现如下:
高效实现(用Counter优化性能)
from collections import Counter list_55 = [[1,2],[2,1],[3,4],[5,6],[4,3],[1,2],[1,2],[6,5],[6,5]] # 先统计每个子列表的出现次数(转成元组,因为列表不可哈希) counts = Counter(tuple(sublist) for sublist in list_55) def sort_key(sublist): t = tuple(sublist) rev_t = tuple(reversed(t)) # 第一优先级:子列表+逆序的总出现次数(取负值实现降序) total_count = counts.get(t, 0) + counts.get(rev_t, 0) # 第二优先级:当前子列表自身的出现次数(取负值实现降序) current_count = counts.get(t, 0) # 第三优先级:保证原列表排在逆序前面(字典序小的在前) is_reversed = 0 if t <= rev_t else 1 return (-total_count, -current_count, is_reversed) # 执行排序 result = sorted(list_55, key=sort_key) print(result)
代码说明
- 统计次数:用
Counter一次性统计所有子列表的出现次数,避免重复调用list.count()带来的性能损耗。 - 排序逻辑:
- 总出现次数优先:确保
[1,2]和[2,1]这类逆序组的总次数高的排在最前 - 自身次数次之:同组内出现次数多的子列表排在前面(比如
[1,2]的实例先于[2,1]) - 逆序区分收尾:通过字典序判断,保证原列表和其逆序能相邻排列
- 总出现次数优先:确保
运行后输出:
[[1, 2], [1, 2], [1, 2], [2, 1], [6, 5], [6, 5], [5, 6], [3, 4], [4, 3]]
简化版(小数据量适用)
如果数据量不大,也可以不用Counter,直接用list.count()实现:
list_55 = [[1,2],[2,1],[3,4],[5,6],[4,3],[1,2],[1,2],[6,5],[6,5]] def sort_key(sublist): rev_sublist = sublist[::-1] total_count = list_55.count(sublist) + list_55.count(rev_sublist) current_count = list_55.count(sublist) is_reversed = 0 if sublist <= rev_sublist else 1 return (-total_count, -current_count, is_reversed) result = sorted(list_55, key=sort_key) print(result)
内容的提问来源于stack exchange,提问作者Iwishworldpeace
相关产品推荐
相关产品推荐

