2008-10-21 7 views
12

I ont le tuple suivant, qui contient des tuples:Tri un tuple qui contient tuples

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

Je souhaite régler ce tuple sur la base de la seconde valeur contenue dans intérieurs-uplets (c.-à trier Pomme, carotte, banane plutôt que A, B, C).

Des pensées?

Répondre

22
from operator import itemgetter 

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

ou sans itemgetter:

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

à noter: si la valeur que vous êtes le tri par peut avoir des doublons, vous pouvez fallback à une autre valeur en donnant des arguments supplémentaires à [ 'itemgetter'] (http://docs.python.org/library/ operator.html # operator.itemgetter), par exemple 'itemgetter (1, 0)'. –

+0

Devrait être "provenant de l'importateur itemgetter". – paragbaxi

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

En d'autres termes, lorsque l'on compare deux éléments du tuple vous le tri, le tri en fonction de la valeur de retour de la fonction passée comme la clé paramètre.

7

De Sorting Mini-HOW TO

Souvent, il y a un ensemble intégré qui vos besoins, tels que str.lower(). Le module opérateur contient un numéro de fonctions utiles à cet effet. Par exemple, vous pouvez trier tuples base sur leur deuxième élément en utilisant 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.

-2

J'ai obtenu la même chose en utilisant ce code, mais votre suggestion est excellente. Merci!

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

Aïe! Pourquoi faire trois copies de tout? Cela me semble excessif. Pour une grande collection de données, ce sera plutôt lent. –

Questions connexes