【问题标题】:Finding max value in the second column of a nested list?在嵌套列表的第二列中查找最大值?
【发布时间】:2011-06-15 14:02:25
【问题描述】:

我有一个这样的列表:

alkaline_earth_values = [['beryllium',  4], 
                         ['magnesium', 12],
                         ['calcium',   20],
                         ['strontium', 38], 
                         ['barium',    56], 
                         ['radium',    88]]

如果我简单地使用max(list) 方法,它将返回答案'strontium',如果我试图找到最大值name,这将是正确的,但是我试图返回整数最大的元素。

【问题讨论】:

  • 这里的答案非常好,但也值得一试a similar question,它作为这个答案的副本已关闭,但仍有一些与这些不同的有用答案.
  • max(alkaline_earth_values) 实际上返回 ['strontium', 38],因此它为您提供名称和值 pair 以及最大值。

标签: python list nested element max


【解决方案1】:

使用key 参数。

max(alk..., key=operator.itemgetter(1))

【讨论】:

  • 如果多个列表与一个元素具有相同的值。 lambda 将如何打印重复项?
  • @user977828 它需要第二次迭代,例如m = max(alkaline_earth_values, key=operator.itemgetter(1)); [item for item in alkaline_earth_values if item[1] == m[1]]
【解决方案2】:
max(alkaline_earth_values, key=lambda x: x[1])

之所以如此,是因为 max 函数的 key 参数指定了一个函数,当 max 想知道该值时调用该函数将搜索最大元素。 max 将为序列中的每个元素调用该函数。 lambda x: x[1] 创建一个小函数,它接收一个列表并返回第一个(从零开始计数)元素。所以

k = lambda x: x[1]

和说的一样

def k(l):
  return l[1]

但在这种情况下更短且很好用。

【讨论】:

  • 您介意用外行的话解释一下这是做什么的吗?我想我理解 x: x[1] 定义了位置,因为如果我用 0 代替 1 它会返回正确的最大字符串值。但是,尽管查看了 Python 库,但我并不完全理解 key 和 lambda 的意义。
  • key 是 max() 内置函数的关键字参数。关键参数应该是一个可调用的(函数、lambda 等),它给定可迭代的元素返回一个用于比较的值。 "lambda x: x[1]" 创建了一个匿名函数 (lambda),它返回支持 Python 切片表示法的东西的第二个元素。
  • 所以,如果我在像碱性地球值这样的列表中有另一层嵌套 = [['beryllium', 4,['a' ,1]],['magnesium', 12, ['b' ,2]],['钙', 20,['c', 3]],['锶', 38 ['d', 4]],['钡', 56['e', 5]] , ['radium', 88['f', 1]]] 我会做 max(alkaline_earth_metals, key = lambda x:x[4] 以便按三重嵌套整数排序吗?
  • 您的意思是值 1,2,3,4,5,1?在这种情况下,你会这样做:key=lambda x: x[2][1]。因为您首先会采用 ['beryllium', 4, [a, 1]] 的第二个元素,即 [a, 1]。然后您将继续获取该列表的第一个元素,即 1。
  • 或者是 print(max(alkaline_earth_metals, key=lambda x: x[2][1]))
【解决方案3】:

假设列表中的项目实际上仍然是一个数字是相当棘手的。如果数字已变成字符串,max() 将返回第一个数字最大的“值”:

alkaline_earth_values = [['beryllium', '9'], ['magnesium', '12'],['calcium', '20'],
                         ['strontium', '38'], ['barium', '56'], ['radium', '88']]
max(alkaline_earth_values, key=lambda x: x[1])

返回['beryllium', '9']

max(alkaline_earth_values, key=lambda x: float(x[1]))

当你确定它是一个数字时,它会起作用

【讨论】:

  • 如果多个列表与一个元素具有相同的值。 itemgetter 将如何打印出副本?
【解决方案4】:

对于高速考虑 pandas 或 numpy:

Import pandas as pd
alkaline_earth_values = [['beryllium', 4], ['magnesium', 12],['calcium', 20],
                     ['strontium', 38], ['barium', 56], ['radium', 88]]
pd.DataFrame(alkaline_earth_values)[1].max()

【讨论】:

  • 如果多个列表与一个元素具有相同的值。大熊猫如何打印出重复的内容?
【解决方案5】:

您可以将列表列表转换为Counter 并调用.most_common() 方法。这很容易让您找到最大值或前 n 个值:

>>> from collections import Counter
>>> Counter(dict(alkaline_earth_values)).most_common(1)
[('radium', 88)]
>>> Counter(dict(alkaline_earth_values)).most_common(3)
[('radium', 88), ('barium', 56), ('strontium', 38)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多