2017-08-08 120 views
1

给出一个列表中的字符串:排序基于多个谓词的字符串列表

['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'] 

我怎样才能做到这一点?

回答

1

您可以先按降序排序,然后按第一个字母排序。由于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) 
0

是在同一条线上去为@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']