Sorting a tuple that contains tuples
11,891
Solution 1
from operator import itemgetter
MY_SORTED_TUPLE = tuple(sorted(MY_TUPLE, key=itemgetter(1)))
or without itemgetter
:
MY_SORTED_TUPLE = tuple(sorted(MY_TUPLE, key=lambda item: item[1]))
Solution 2
From Sorting Mini-HOW TO
Often there's a built-in that will match your needs, such as str.lower(). The operator module contains a number of functions useful for this purpose. For example, you can sort tuples based on their second element using operator.itemgetter():
>>> import operator
>>> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
>>> map(operator.itemgetter(0), L)
['c', 'd', 'a', 'b']
>>> map(operator.itemgetter(1), L)
[2, 1, 4, 3]
>>> sorted(L, key=operator.itemgetter(1))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
Hope this helps.
Solution 3
sorted(my_tuple, key=lambda tup: tup[1])
In other words, when comparing two elements of the tuple you're sorting, sort based on the return value of the function passed as the key parameter.
Comments
-
Huuuze almost 2 years
I have the following tuple, which contains tuples:
MY_TUPLE = ( ('A','Apple'), ('C','Carrot'), ('B','Banana'), )
I'd like to sort this tuple based upon the second value contained in inner-tuples (i.e., sort Apple, Carrot, Banana rather than A, B, C).
Any thoughts?
-
user1066101 over 15 yearsOuch! Why make three copies of everything? Seems excessive to me. For a large collection of data, this will be pretty slow.
-
Petr Viktorin over 12 yearsOf note: if the value you're sorting by can have duplicates, you can fallback to another value by giving additional arguments to
itemgetter
, e.g.itemgetter(1, 0)
. -
paragbaxi about 12 yearsShould be "from operator import itemgetter".