2008-10-21 10 views
12

I tienen la siguiente tupla, que contiene tuplas:Ordenando una tupla que contiene tuplas

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

me gustaría para ordenar esta tupla en base a la segundo valor contenida en interiores-tuplas (es decir, una especie Apple, Zanahoria, Plátano en lugar de A, B, C).

¿Alguna idea?

Respuesta

22
from operator import itemgetter 

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

o sin itemgetter:

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

De nota: si el valor que está por clasificar puede tener duplicados, puede repliegue a otro valor, dando argumentos adicionales a [ 'itemgetter'] (http://docs.python.org/library/ operator.html # operator.itemgetter), por ejemplo 'itemgetter (1, 0)'. –

+0

Debe ser "del ítem de importación del operador". – paragbaxi

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

En otras palabras, cuando se comparan dos elementos de la tupla que estés clasificación, ordenación basada en el valor de retorno de la función pasada como la clave parámetro.

7

De Sorting Mini-HOW TO

A menudo hay un built-in que satisfacer sus necesidades, tales como str.lower(). El módulo de operador contiene un número de funciones útiles para este propósito. Por ejemplo, puede ordenar las tuplas basado en su segundo elemento utilizando 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)] 

Espero que esto ayude.

-2

Logré lo mismo con este código, pero su sugerencia es genial. ¡Gracias!

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

¡Ay! ¿Por qué hacer tres copias de todo? Me parece excesivo. Para una gran colección de datos, esto será bastante lento. –

Cuestiones relacionadas