Сортировка кортежа, содержащего кортежи - PullRequest
12 голосов
/ 21 октября 2008

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

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

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

Есть мысли?

Ответы [ 4 ]

22 голосов
/ 21 октября 2008
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]))
7 голосов
/ 21 октября 2008

С Сортировка мини-КАК

Часто есть встроенный, который будет соответствует вашим потребностям, например, 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)]

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

2 голосов
/ 21 октября 2008
sorted(my_tuple, key=lambda tup: tup[1])

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

0 голосов
/ 21 октября 2008

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

templist = [ (line[1], line) for line in MY_TUPLE ] 
templist.sort()
SORTED_MY_TUPLE = [ line[1] for line in templist ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...