关于python:如何按字符串长度和字母顺序排序?

how to sort by length of string followed by alphabetical order?

我目前是python的新手,并且陷入了这个问题,似乎找不到正确的答案。

问题:给出一个单词列表,按长度顺序(最长到最短)返回相同单词的列表,第二个排序标准应按字母顺序。 提示:您需要考虑两个功能。

这是我到目前为止的内容:

1
2
3
4
5
6
def bylength(word1,word2):
    return len(word2)-len(word1)

def sortlist(a):
    a.sort(cmp=bylength)
    return a

它按长度排序,但是我不知道如何将第二个条件应用于这种排序,即按字母顺序降序排列。


您可以按照以下两个步骤进行操作:

1
2
the_list.sort() # sorts normally by alphabetical order
the_list.sort(key=len, reverse=True) # sorts by descending length

Python的排序是稳定的,这意味着当长度相等时,按长度对列表进行排序会使元素按字母顺序排列。

您也可以这样:

1
the_list.sort(key=lambda item: (-len(item), item))

通常,您不需要cmp,甚至在Python3中将其删除。 key易于使用。


1
2
3
4
n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']

for i in reversed(sorted(n, key=len)):
    print i

yyyyy dddl dddd ccc bbb aaa

1
2
for i in sorted(n, key=len, reverse=True):
     print i

yyyyy dddd dddl aaa bbb ccc


1
2
3
4
5
6
7
8
9
10
11
12
13
-Sort your list by alpha order, then by length.

See the following exmple:

>>> coursesList = ["chemistry","physics","mathematics","art"]
>>> sorted(coursesList,key=len)
['art', 'physics', 'chemistry', 'mathematics']
>>> coursesList.append("mopsosa")
>>> sorted(coursesList,key=len)
['art', 'physics', 'mopsosa', 'chemistry', 'mathematics']
>>> coursesList.sort()
>>> sorted(coursesList,key=len)
['art', 'mopsosa', 'physics', 'chemistry', 'mathematics']

尽管Jochen Ritzel表示您不需要cmp,但这实际上是一个很好的用例! 使用cmp,您可以按长度排序,然后按字母顺序在一半的时间内进行两次排序!

1
2
3
4
5
6
7
def cmp_func(a, b):
    # sort by length and then alphabetically in lowercase
    if len(a) == len(b):
        return cmp(a, b)
    return cmp(len(a), len(b))

sorted_the_way_you_want = sorted(the_list, cmp=cmp_func)

例:

1
2
3
>>> the_list = ['B', 'BB', 'AA', 'A', 'Z', 'C', 'D']
>>> sorted(the_list, cmp=cmp_func)
['A', 'B', 'C', 'D', 'Z', 'AA', 'BB']

请注意,如果您的列表是大小写混合使用,则将cmp(a, b)替换为cmp(a.lower(), b.lower()),因为python对'a'>'Z'进行排序。

在python3中,您需要使用定义的__lt__样式比较函数或functools.cmp_to_key()为您完成的对象对对象进行排序。