Сортировка кортежа, содержащего кортежи

У меня есть следующий кортеж, который содержит кортежи:

MY_TUPLE = (
    ('A','Apple'),
    ('C','Carrot'),
    ('B','Banana'),
)

Я хотел бы отсортировать этот кортеж на основе значения second, содержащегося во внутренних кортежах (т.е. сортировать Apple, Carrot, Banana, а не A, B, C).

Любые мысли?

Ответ 1

from operator import itemgetter

MY_SORTED_TUPLE = tuple(sorted(MY_TUPLE, key=itemgetter(1)))

или без itemgetter:

MY_SORTED_TUPLE = tuple(sorted(MY_TUPLE, key=lambda item: item[1]))

Ответ 2

От Сортировка Mini-HOW TO

Часто есть встроенный, который будет соответствуют вашим потребностям, например str.lower(). Модуль оператора содержит число функций, полезных для этой цели. Например, вы можете сортировать кортежи на основе на их втором элементе, используя 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)]

Надеюсь, что это поможет.

Ответ 3

sorted(my_tuple, key=lambda tup: tup[1])

Другими словами, при сравнении двух элементов кортежа, которые вы сортируете, выполните сортировку на основе возвращаемого значения функции, переданной в качестве ключевого параметра.

Ответ 4

Я получил то же самое, используя этот код, но ваше предложение замечательно. Спасибо!

templist = [ (line[1], line) for line in MY_TUPLE ] 
templist.sort()
SORTED_MY_TUPLE = [ line[1] for line in templist ]