【问题标题】:Advanced sorting criteria for a list of nested tuples嵌套元组列表的高级排序标准
【发布时间】:2011-04-19 09:19:58
【问题描述】:

我有一个嵌套元组列表:

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

现在我想选择最大化 a 同时最小化 bc 的元素。例如在

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

获胜者应该是

(7, (4, 1))

感谢任何帮助。

【问题讨论】:

  • 给定(7,(4,1))(7,(3,2)),谁赢了?
  • 好问题。 (7,(3,2)) 获胜。
  • 让我猜猜你在排序中的优先级:最大的a,然后是最小的b,然后是最小的c。对吗?
  • @eksortso:是的,没错。我应该在问题中说明这一点,对不起。但是,在我的数据中,c 往往非常小,因此实际上可以忽略。

标签: python list sorting tuples


【解决方案1】:

在我的理解中,您希望按 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)]

【讨论】:

  • maxkey 参数,所以不需要创建中间列表。迹象当然需要扭转。
  • @SilentGhost:当然max 函数在这里是个好主意。我想指出,根据 OP 试图解决的问题(或作业),可能需要选择多个项目。因此,预先排序的列表会更好。
  • 这实际上是一个真正的问题,没有功课。还是谢谢。
【解决方案2】:
>>> max(lst, key=lambda x: (x[0], -x[1][0], -x[1][1]))
(7, (4, 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2013-11-28
    • 2017-08-01
    相关资源
    最近更新 更多