Python 如何按子列表的反向长度对嵌套列表进行排序并保持原始顺序

Python 如何按子列表的反向长度对嵌套列表进行排序并保持原始顺序,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,例如: a = [ [['test', 21, 28], ['test', 61, 68], ['test', 111, 118], ['test', 118, 125]], [['Columns', 21, 28], ['Columns', 61, 68], ['Columns', 111, 118], ['Columns', 118, 125], ['Columns', 128, 135]], [['Delete', 14, 20], ['Delete', 47, 53], ['Dele

例如:

a = 
[
[['test', 21, 28], ['test', 61, 68], ['test', 111, 118], ['test', 118, 125]],
[['Columns', 21, 28], ['Columns', 61, 68], ['Columns', 111, 118], ['Columns', 118, 125], ['Columns', 128, 135]], 
[['Delete', 14, 20], ['Delete', 47, 53], ['Delete', 54, 60], ['Delete', 78, 84], ['Delete', 95, 101]], 
[['rw', 21, 28], ['rw', 61, 68], ['rw', 111, 118]]
]
我想做的是按照子列表的反向长度对嵌套列表进行排序 但如果子列表的长度相同,则保持原始顺序

预期结果:

[
[['Columns', 21, 28], ['Columns', 61, 68], ['Columns', 111, 118], ['Columns', 118, 125], ['Columns', 128, 135]], 
[['Delete', 14, 20], ['Delete', 47, 53], ['Delete', 54, 60], ['Delete', 78, 84], ['Delete', 95, 101]], 
[['test', 21, 28], ['test', 61, 68], ['test', 111, 118], ['test', 118, 125]], 
[['rw', 21, 28], ['rw', 61, 68], ['rw', 111, 118]]
]
我知道我可以使用它按反向长度对列表进行排序,但它不会保持原始顺序:

a = sorted(a, key=len, reverse=True)
(它反转子列表“删除”和“列”)


如何按子列表的反向长度对列表进行排序并保持原始顺序?

TimSort是一种稳定的排序,因此它通常保留相等项的顺序。因此,您的代码应该正常工作

或者,去掉
reverse=True
,使用返回子列表长度负数的键函数

a = [
    [['test', 21, 28], ['test', 61, 68], ['test', 111, 118], ['test', 118, 125]],
    [['Columns', 21, 28], ['Columns', 61, 68], ['Columns', 111, 118], ['Columns', 118, 125], ['Columns', 128, 135]],    
    [['Delete', 14, 20], ['Delete', 47, 53], ['Delete', 54, 60], ['Delete', 78, 84], ['Delete', 95, 101]], 
    [['rw', 21, 28], ['rw', 61, 68], ['rw', 111, 118]]
]

a.sort(key=lambda x: -len(x))
for row in a:
    print(row)
输出

[['Columns', 21, 28], ['Columns', 61, 68], ['Columns', 111, 118], ['Columns', 118, 125], ['Columns', 128, 135]]
[['Delete', 14, 20], ['Delete', 47, 53], ['Delete', 54, 60], ['Delete', 78, 84], ['Delete', 95, 101]]
[['test', 21, 28], ['test', 61, 68], ['test', 111, 118], ['test', 118, 125]]
[['rw', 21, 28], ['rw', 61, 68], ['rw', 111, 118]]
如果我使用

a.sort(key=len, reverse=True)
我得到与上面相同的输出。如果你没有得到输出,就会发生一些非常奇怪的事情。请注意,这个版本比上面的版本更高效,因为它直接调用
len
(用C实现,它执行快速属性查找以确定对象的长度),Python函数调用相对较慢,无论是
def
函数还是
lambda
s



顺便说一句,当你想对一个列表进行排序时,你应该总是调用它的
.sort
方法。内置的
sorted
函数实际上创建了一个新列表,将原始数据复制到该列表中,然后对其调用
.sort
,然后将新列表绑定到目标。因此,避免创建副本并调用原始列表中的
.sort
更有效。

关键字
reverse
真的会影响排序的稳定性吗?文档表明,
reverse参数仍然保持排序的稳定性(以便具有相等键的记录保持原始顺序)
-在@ewcz的“奇数和结尾”中,我认为@ewcz是正确的,例如,
sorted(['a',b',key=len)=sorted(['a',b',key=len reverse=True)
@ewcz嘿,你说得对!我应该测试OP的代码:oops:@PM2Ring没问题,我也不知道OP到底想要什么:)-或者她/他正在使用一些古老的Python,我在某处读到,排序应该在
2.4
@Chris\u Rands时是稳定的。我更新了我的答案。我差点把它删除了,但我觉得它有一些价值。。。