python排序列表与tie-breaker

时间:2016-10-24 15:40:14

标签: python list sorting sublist

使用打破平局对列表列表进行排序的最pythonic方法是什么?

我可以按子列表长度排序(从最长到最短):

>>> l = [['c'], ['a', 'b'], ['b', 'c'], ['a', 'b', 'c']]

>>> list(reversed(sorted(l, key=len)))
[['a', 'b', 'c'], ['b', 'c'], ['a', 'b'], ['c']]

但是我想在长度相等时保留顺序,所以我想要的输出是:

[['a', 'b', 'c'], ['a', 'b'], ['b', 'c'], ['c']]

2 个答案:

答案 0 :(得分:5)

Timsort(Python的内置排序算法)是稳定的,这意味着保持元素的原始顺序具有相同的键。但是,您使用reversed函数撤消了原始订单。

如果要反转结果列表保留比较相等的元素的原始顺序,请使用reverse=True

In [3]: sorted(l, key=len, reverse=True)
Out[3]: [['a', 'b', 'c'], ['a', 'b'], ['b', 'c'], ['c']]

答案 1 :(得分:0)

您可以创建一个新列表,将每个元素与其在原始列表中的位置相比较,然后使用该值作为键的次要部分进行排序,最后剥离最终结果的位置。