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

给定一个单词列表,返回一个具有相同单词的列表,其顺序为 长度(从最长到最短) ,第二个排序条件应该是 提示: 您需要考虑两个函数。

以下是我目前掌握的情况:

def bylength(word1,word2):
return len(word2)-len(word1)


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

它按照长度进行排序,但我不知道如何将第二个标准应用于这种排序,即按字母降序排序。

118492 次浏览

You can do it in two steps like this:

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

Python's sort is stable, which means that sorting the list by length leaves the elements in alphabetical order when the length is equal.

You can also do it like this:

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

Generally you never need cmp, it was even removed in Python3. key is much easier to use.

n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']


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

yyyyy dddl dddd ccc bbb aaa

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

yyyyy dddd dddl aaa bbb ccc

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

Although Jochen Ritzel said you don't need cmp, this is actually a great use case for it! Using cmp you can sort by length and then alphabetically at the same time in half the time sorting twice would take!

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)

Example:

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

Note, if your list is a mix of upper and lower case replace cmp(a, b) with cmp(a.lower(), b.lower()) as python sorts 'a' > 'Z'.

In python3 you'd need to be sorting objects with __lt__ style comparison functions defined or functools.cmp_to_key() which does that for you.

First sort by Alphabet and then sort by Length.

Here is a working example

mylist.sort()
mylist = sorted(mylist, key=len, reverse=False)


# Print the items on individual line
for i in mylist:
print(i)

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)