Python 基于多个谓词对字符串列表进行排序

Python 基于多个谓词对字符串列表进行排序,python,string,list,sorting,Python,String,List,Sorting,给定一个字符串列表: ['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13'] 这是调用sorted后正常排序版本的外观: ['abacus', 'azb', 'azz', 'bar', 'bars13', 'foo', 'foo2', 'foo3'] 我想先对所有字符串进行排序,然后,对于第一个字母相同的所有字符串,按降序排序 对于上面的例子,我想要 ['azz', 'azb', 'abacus', 'bars13',

给定一个字符串列表:

['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']
这是调用
sorted
后正常排序版本的外观:

['abacus', 'azb', 'azz', 'bar', 'bars13', 'foo', 'foo2', 'foo3']
我想先对所有字符串进行排序,然后,对于第一个字母相同的所有字符串,按降序排序

对于上面的例子,我想要

['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']

我该怎么做呢?

您可以先按降序排序,然后按第一个字母排序。由于Python的排序算法是稳定的,这将导致第二个排序中的所有“关系”(即第一个字母相同的单词)保持与第一个排序相同的相对顺序

l = sorted(l, reverse=True)
l = sorted(l, key=lambda s: s[0])
您还可以通过一次调用
sorted()
来完成此操作,如下所示:

l = sorted(l, key=lambda s: (-ord(s[0]), s), reverse=True)

与@COLDSPEED在同一行的两次通过解决方案:

>>> import itertools
>>>
>>> l = ['foo2', 'abacus', 'azz', 'foo', 'foo3', 'bar', 'azb', 'bars13']
>>> s = sorted(l, key=lambda x:(x, len(x)))
>>> t = []
>>>
>>> for g, elems in itertools.groupby(s, key=lambda x: x[0]):
...     t.extend(reversed(list(elems)))
>>>
>>> t
['azz', 'azb', 'abacus', 'bars13', 'bar', 'foo3', 'foo2', 'foo']