# python – Sort a list of tuples by 2nd item (integer value)

## The Question :

439 people think this question is useful

I have a list of tuples that looks something like this:

[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]



I want to sort this list in ascending order by the integer value inside the tuples. Is it possible?

679 people think this answer is useful

Try using the key keyword with sorted().

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x)



key should be a function that identifies how to retrieve the comparable element from your data structure. In your case, it is the second element of the tuple, so we access .

For optimization, see jamylak’s response using itemgetter(1), which is essentially a faster version of lambda x: x.

205 people think this answer is useful
>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]



IMO using itemgetter is more readable in this case than the solution by @cheeken. It is also faster since almost all of the computation will be done on the c side (no pun intended) rather than through the use of lambda.

>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop

>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x)"
1000000 loops, best of 3: 1.4 usec per loop



46 people think this answer is useful

Adding to Cheeken’s answer, This is how you sort a list of tuples by the 2nd item in descending order.

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x, reverse=True)



42 people think this answer is useful

As a python neophyte, I just wanted to mention that if the data did actually look like this:

data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]



then sorted() would automatically sort by the second element in the tuple, as the first elements are all identical.

19 people think this answer is useful

For an in-place sort, use

foo = [(list of tuples)]
foo.sort(key=lambda x:x) #To sort by first element of the tuple



15 people think this answer is useful

From python wiki:

>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]



8 people think this answer is useful

For a lambda-avoiding method, first define your own function:

def MyFn(a):
return a



then:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)



3 people think this answer is useful

For Python 2.7+, this works which makes the accepted answer slightly more readable:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)



>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x)