【问题标题】:Optimal method to find the max of sublist items within list查找列表中最大子列表项的最佳方法
【发布时间】:2016-12-03 23:43:36
【问题描述】:

我有一个格式如下的多维列表:

list = [[1, 2, 3], [2, 4, 2], [0, 1, 1]]

如何获取所有子列表的第三个值的最大值。在伪代码中:

max(list[0][2], list[1][2], list[2][2])

我知道这可以通过迭代列表并将第三个值提取到新列表中来完成,然后只需执行 max(list),但我想知道这是否可以使用 lambda 或列表理解来完成?

【问题讨论】:

  • max(lis, key=lambda m: m[-1])max(lis, key=lambda m: m[-1])[-1]
  • @AvinashRaj 第一个将返回具有最大值的列表,而不是最大值本身。
  • 是的,第一个将返回最后一个具有最大元素的列表项

标签: python arrays list list-comprehension


【解决方案1】:

使用zip 函数获取列列表,然后使用简单的索引来获取预期列:

>>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]]
>>> 
>>> max(zip(*lst)[-1]) # in python 3.x max(list(zip(*lst))[-1])
3

另一种替代方法和更 Pythonic 的方法是将 key 函数传递给 max 以根据 key 函数获取最大项目。在这种情况下,您可以使用itemgetter(-1) 来获取基于预期索引的最大项目,然后由于max() 函数从您的列表(子列表)中返回整个项目,您可以通过索引获得预期项目:

>>> from operator import itemgetter
>>> max(lst, key=itemgetter(-1))[-1]
3

或更多功能:

>>> key_func = itemgetter(-1)
>>> key_func(max(lst, key=key_func))
3 

【讨论】:

  • 请注意,zip(...)[-1] 只能在 Python 2.x 中工作,然后会比其他版本慢一些。
【解决方案2】:

在列表上应用max 将返回最大列表,这不是您想要的。您确实可以使用列表推导来提取第三个元素,然后在该推导上应用 max

>>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]]
>>> max([x[2] for x in lst])
3

【讨论】:

    【解决方案3】:

    只需将max 与生成器表达式一起使用:

    >>> lst = [[1, 2, 3], [2, 4, 2], [0, 1, 1]]
    >>> max(l[2] for l in lst)
    3
    

    另外,不要将你的变量命名为list,你正在隐藏类型。

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2013-11-26
      • 2010-10-28
      • 2023-01-02
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2012-10-31
      • 2016-11-08
      相关资源
      最近更新 更多