Adrian
Adrian

Reputation: 8171

How to sort a list by length of string followed by reverse alphabetical order?

Given a list of words, return a list with the same words in order of length (longest to shortest), the second sort criteria should be alphabetical. Hint: you need think of two functions.

This is what I have so far:

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

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

it sorts by length but I don't know how to apply the second criteria to this sort, which is by alphabetical descending.

Upvotes: 91

Views: 136505

Answers (6)

Wendell Blanco
Wendell Blanco

Reputation: 1

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)

Upvotes: -2

Naveed Abbas
Naveed Abbas

Reputation: 1187

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)

Upvotes: 2

theannouncer
theannouncer

Reputation: 1212

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.

Upvotes: -1

Arindam Roychowdhury
Arindam Roychowdhury

Reputation: 6511

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

Upvotes: 8

jyfar
jyfar

Reputation: 195

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

Upvotes: 3

Jochen Ritzel
Jochen Ritzel

Reputation: 107638

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.

Upvotes: 194

Related Questions