在嵌套列表中查找第二列的最大值?

46
  • Item 1
  • Item 2
  • Item 3

How can I remove the last item (Item 3) from the list using JavaScript?

alkaline_earth_values = [['beryllium',  4], 
                         ['magnesium', 12],
                         ['calcium',   20],
                         ['strontium', 38], 
                         ['barium',    56], 
                         ['radium',    88]]
如果我只是简单地使用max(list)方法,它将返回答案'strontium',如果我尝试查找最高的名称,那么这将是正确的,然而我正在尝试返回其整数最高的元素。

3
这里的回答都很好,但是也值得查看一个类似的问题。该问题已被关闭为重复,但仍然有一些有用的答案与这些不同。链接为:https://dev59.com/VG7Xa4cB1Zd3GeqPqXwr - John Y
max(alkaline_earth_values) 实际上返回 ['锶', 38],因此它给出了具有最大值的名称和数值 _对_。 - martineau
5个回答

84
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] 定义了位置,因为如果我将 1 替换为 0,它会返回正确的最大字符串值。但是,尽管查看了 Python 库,我仍然不完全理解 key 和 lambda 的作用。 - davelupt
1
key是max()内置函数的一个关键字参数。key参数应该是一个可调用对象(函数、lambda等),它接受可迭代对象的元素并返回用于比较的值。"lambda x: x[1]"创建了一个匿名函数(lambda),它返回支持Python切片表示法的某个东西的第二个元素。 - Spike Gronim
如果我在列表中有另一层嵌套,例如alkaline_earth_values = [['beryllium', 4,['a' ,1]],['magnesium', 12, ['b',2]],['calcium', 20,['c', 3]],['strontium', 38 ['d', 4]],['barium', 56['e', 5]], ['radium', 88['f', 1]]]我是否应该使用max(alkaline_earth_metals, key = lambda x:x[4]来按三重嵌套整数排序? - davelupt
1
你的意思是按照 1、2、3、4、5、1 这几个值排序吗?如果是这样,你可以这样做:key=lambda x: x[2][1]。因为你首先会取出 ['beryllium', 4, [a, 1]] 中的第二个元素,即 [a, 1]。然后你会继续取出该列表的第一个元素,也就是 1。 - kynnysmatto
我曾与一个最近转向Python的团队合作过,我发现使用max()处理嵌套序列时很容易混淆。结果,我写了一个教程来深入探讨如何修改默认排序行为,希望这能对有所帮助的人有所启发:https://dbader.org/blog/python-min-max-and-nested-lists - dbader
显示剩余2条评论

8

使用key参数。

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

1
如果多个列表具有相同的元素值,lambda 如何打印出重复项? - user977828
它需要进行第二次迭代,例如 m = max(alkaline_earth_values, key=operator.itemgetter(1)); [item for item in alkaline_earth_values if item[1] == m[1]] - Chris_Rands

0

你可以将你的列表转换为 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)]

0

如果需要高速处理,请考虑使用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()

如果多个列表具有相同的元素值,pandas会如何打印出重复项? - user977828

0

假设列表中的一个项目仍然是一个数字是相当棘手的。如果这些数字已经变成字符串,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])

返回 ['铍', '9']

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

当你确定它是一个数字时,这将起到作用。


如果多个列表具有相同的元素值,itemgetter 会如何打印重复项? - user977828

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接