2010-09-30 123 views
1

我有形式的嵌套元組的列表的列表高級排序標準:嵌套元組

[(a, (b, c)), ...] 

現在我想挑最大化一個,同時最小化b元件c。例如,在

[(7, (5, 1)), (7, (4, 1)), (6, (3, 1))] 

的贏家應該是

(7, (4, 1)) 

任何幫助表示讚賞。

+2

鑑於'(7,(4,1))'和'(7,(3,2))',哪一個贏? – Daenyth 2010-09-30 14:38:00

+0

好問題。 (7,(3,2))勝出。 – mathias 2010-09-30 14:57:37

+0

讓我猜測你在排序中的優先順序:最大的'a',然後是最小的'b',然後是最小的'c'。是對的嗎? – eksortso 2010-09-30 15:48:02

回答

4

在我的理解中,你想按a遞減排序,然後按b遞增排序,然後按c排序。如果這是正確的,你可以這樣做:

>>> l=[(7, (5, 1)), (7, (4, 1)), (6, (3, 2)), (6, (3, 1))] 
>>> sorted(l, key = lambda x: (-x[0], x[1])) 
[(7, (4, 1)), (7, (5, 1)), (6, (3, 1)), (6, (3, 2))] 

選擇「贏家」就像挑選第一個元素一樣簡單。

如果b和c應該總結,那麼在我的示例中,它將僅僅是sum(x[1])而不是x[1]

我的鍵功能返回一個元組因爲Python正確排序的元組包含多個元素:

>>> sorted([(1,2), (1,1), (1,-1), (0,5)]) 
[(0, 5), (1, -1), (1, 1), (1, 2)] 
+0

'max'具有'key'參數,所以不需要創建中間列表。這些跡象當然需要扭轉。 – SilentGhost 2010-09-30 14:30:58

+0

@SilentGhost:當然'max'函數在這裏是個好主意。我想指出的是,根據OP試圖解決的問題(或家庭作業),可能需要選擇多個項目。因此,預先列出的名單會更好。 – AndiDog 2010-09-30 14:34:54

+0

這實際上是一個真正的問題,沒有作業。不管怎麼說,還是要謝謝你。 – mathias 2010-09-30 14:58:49

4
>>> max(lst, key=lambda x: (x[0], -x[1][0], -x[1][1])) 
(7, (4, 1))