2017-08-08 74 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']