2008-10-21 81 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 ]