Sorting Python list based on the length of the string

Question:

I want to sort a list of strings based on the string length. I tried to use sort as follows, but it doesn’t seem to give me correct result.

``````xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
``````

What might be wrong?

When you pass a `lambda` to `sort`, you need to return an integer, not a boolean. So your code should instead read as follows:

``````xs.sort(lambda x,y: cmp(len(x), len(y)))
``````

Note that cmp is a builtin function such that `cmp(x, y)` returns -1 if `x` is less than `y`, 0 if `x` is equal to `y`, and 1 if `x` is greater than `y`.

Of course, you can instead use the `key` parameter:

``````xs.sort(key=lambda s: len(s))
``````

This tells the `sort` method to order based on whatever the key function returns.

EDIT: Thanks to balpha and Ruslan below for pointing out that you can just pass `len` directly as the key parameter to the function, thus eliminating the need for a `lambda`:

``````xs.sort(key=len)
``````

And as Ruslan points out below, you can also use the built-in sorted function rather than the `list.sort` method, which creates a new list rather than sorting the existing one in-place:

``````print(sorted(xs, key=len))
``````

The same as in Eli’s answer – just using a shorter form, because you can skip a `lambda` part here.

Creating new list:

``````>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
``````

In-place sorting:

``````>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
``````

I Would like to add how the pythonic key function works while sorting :

Decorate-Sort-Undecorate Design Pattern :

Python’s support for a key function when sorting is implemented using what is known as the
decorate-sort-undecorate design pattern.

It proceeds in 3 steps:

1. Each element of the list is temporarily replaced with a “decorated” version that includes the result of the key function applied to the element.

2. The list is sorted based upon the natural order of the keys.

3. The decorated elements are replaced by the original elements.

Key parameter to specify a function to be called on each list element prior to making comparisons. docs

Write a function lensort to sort a list of strings based on length.

``````def lensort(a):
n = len(a)
for i in range(n):
for j in range(i+1,n):
if len(a[i]) > len(a[j]):
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
print lensort(["hello","bye","good"])
``````
``````def lensort(list_1):
list_2=[];list_3=[]
for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
list_3.append(i[0])
return list_3
``````

This works for me!

The easiest way to do this is:

list.sort(key = lambda x:len(x))

I can do it using below two methods, using function

``````def lensort(x):
list1 = []
for i in x:
list1.append([len(i),i])
return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])
``````

`````` lista = ['a', 'bb', 'ccc', 'dddd']