Sorting Python list based on the length of the string

PythonListSorting

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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 http://docs.python.org/library/functions.html#cmp">cmp</a> 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 http://docs.python.org/library/functions.html#sorted">sorted</a> 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))

Solution 2 - Python

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

Solution 3 - Python

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

Solution 4 - Python

The easiest way to do this is:

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

Solution 5 - Python

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"])

Solution 6 - Python

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

In one Liner using Lambda, as below, a already answered above.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)

Solution 7 - Python

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!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionprosseekView Question on Stackoverflow
Solution 1 - PythonEli CourtwrightView Answer on Stackoverflow
Solution 2 - PythonRuslan SpivakView Answer on Stackoverflow
Solution 3 - PythonJamesView Answer on Stackoverflow
Solution 4 - PythonChirag PatelView Answer on Stackoverflow
Solution 5 - PythonFebin StephenView Answer on Stackoverflow
Solution 6 - PythonAashutosh KumarView Answer on Stackoverflow
Solution 7 - PythonSaurabh AriyanView Answer on Stackoverflow