2010-09-30 73 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))