按长度和字母顺序排序字符串列表

0 投票
5 回答
14067 浏览
提问于 2025-04-16 09:45

我需要根据两个标准对一组单词进行排序。首先,我想要把这些单词按长度从长到短排列;其次,如果长度相同,就按字母顺序排列。

举个例子,假设有这样一个单词列表:

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

撰写回答