按长度和字母顺序排序字符串列表
我需要根据两个标准对一组单词进行排序。首先,我想要把这些单词按长度从长到短排列;其次,如果长度相同,就按字母顺序排列。
举个例子,假设有这样一个单词列表:
l = ['aa','aaa','aaaa','b','bb','z','ccc']
我希望得到的结果是:
['aaaa', 'aaa', 'ccc', 'aa', 'bb', 'b', 'z']
5 个回答
2
在Python中,列表的排序方法有一个叫做key的参数,可以用来指定排序的标准。对于你提到的问题,我会使用这个key,同时进行正常的排序,方法如下。
>>> l = ['aa','aaa','aaaa','b','bb','z','ccc']
>>> l.sort(key=len,reverse=True)
>>> l
['aaaa', 'ccc', 'aaa', 'bb', 'aa', 'z', 'b']
>>> l.sort()
>>> l
['aa', 'aaa', 'aaaa', 'b', 'bb', 'ccc', 'z']
>>>
6
设计
这里的关键词是“稳定排序算法”。想象一下有两个稳定的排序函数:
- 一个是根据长度排序(保持相同长度的条目之间的相对顺序),
- 另一个是按字母顺序排序。
那么,你应该以什么顺序组合这两个函数,才能得到想要的排序呢?
实现
正如其他人提到的,第一个排序函数可以这样调用:
list.sort(key=len, reverse=True)
第二个排序函数可以这样调用:
list.sort()
这些信息应该足够你写出完整的解决方案了。
结果
如果你以正确的方式组合这两个函数,你应该能得到以下结果:
>>> l = ['aaa', 'fff', 'bbb', 'ddd', 'e', 'cccc']
# ... sorting functions combined in the right way ...
>>> l
['cccc', 'aaa', 'bbb', 'ddd', 'fff', 'e']
11
你只需要调用一次 sort
,因为Python会自动按字典顺序对元组进行排序。也就是说,当你让Python比较两个元组时,它会先看第一个元素,如果这两个元素相等,就会看第二个元素,如果还相等,就继续往后看……
你想要根据字符串的长度(取负值)和字母顺序来排序元素列表,所以你需要把字符串 s
的关键字设置为元组 (-len(s), s)
。因此:
>>> l = ['aa','aaa','aaaa','b','bb','z','ccc']
>>> sort_key = lambda s: (-len(s), s)
>>> l.sort(key=sort_key)
>>> l
['aaaa', 'aaa', 'ccc', 'aa', 'bb', 'b', 'z']