2008-10-21 54 views
12

我有以下元组,其中包含的元组的元组:排序包含元组

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

我想排序基于包含在内部元组(即,第二该元组,分类苹果,胡萝卜,香蕉而不是A,B,C)。

有什么想法?

回答

22
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])) 
+1

注意:如果您排序的值可能有重复项,您可以通过为[`itemgetter`]提供附加参数来回退到另一个值(http://docs.python.org/library/ operator.html#operator.itemgetter),例如`itemgetter(1,0)`。 – 2011-12-03 18:22:43

+0

应该是“从运营商导入itemgetter”。 – paragbaxi 2012-04-12 22:19:37

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

换句话说,比较你整理的元组的两个元素时,排序依据为重点,通过函数的返回值参数。

7

Sorting 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)] 

希望这有助于。

-2

我用这段代码实现了同样的事情,但是你的建议很棒。谢谢!

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