如何在绑定数字的列表中找到最大数字

Posted

技术标签:

【中文标题】如何在绑定数字的列表中找到最大数字【英文标题】:How to find the max number(s) in a list with tied numbers 【发布时间】:2014-03-18 16:13:51 【问题描述】:

假设我有一个类似的列表:

my_list = [12, 13, 51, 21, 22, 58, 45.1, 34.2, 56, 6, 58, 58] 

所以这里的最大数字显然是 58,但我不只是想返回 一个 58,我想要一个具有该最大数字的所有索引的列表。

基本上为此我想要结果[5, 10, 11]

我知道如果我想要最大数量,我可以做到my_list.index(max(my_list)),但这只会给我第一个索引。

有什么建议吗?另外,我想坚持简单的方法,如sortmaxlen等……

【问题讨论】:

另见more_itertools.locate() 这能回答你的问题吗? How to find all positions of the maximum value in a list? 【参考方案1】:

你可以用max来确定maxval

maxval = max(my_list)

然后使用enumerate 和list comprehension 获取索引:

indices = [index for index, val in enumerate(my_list) if val == maxval]

对于你的例子,我明白了

maxval == 58
indices = [5, 10, 11]

根据 Keyser 的建议,您可以通过以下方式保存对列表的两次迭代(一次确定 maxval,一次找到匹配的 indexes):

maxval = None
for index, val in enumerate(my_list):
    if maxval is None or val > maxval:
        indices = [index]
        maxval = val
    elif val == maxval:
        indices.append(index)

【讨论】:

或者,用一些内存替换运行时,遍历列表一次并以某种方式跟踪迄今为止最大的索引。我没有任何pythonic。 不错的一个。绝对 +1 第二个示例中的轻微但重要的错误:它需要将index 附加到indices,而不是val... 另外,我不认为所有的开销都值得保存那个额外的迭代。对于短列表,列表解析版本的速度是 elif 方法的两倍,对于较长的列表,它的速度是 4 倍。 如果列表中有负值则失败..@jonrsharpe @Achy97 据我所知,它适用于负值。例如,如果我使用my_list = [12, 13, 51, 21, -22, 58, 45.1, 34.2, -56, 6, 58, 58] 运行,我仍然会得到[5, 10, 11]。目前尚不清楚您的具体问题是什么。【参考方案2】:

类似于枚举和列表推导,你也可以使用过滤器:

maxval = max(my_list)
indices = list(filter(lambda x: my_list[x]==maxval, list(range(len(my_list)))))

【讨论】:

【参考方案3】:

我尽量采用最 Pythonic 的方式

my_list = [12, 13, 51, 21, 22, 58, 45.1, 34.2, 56, 6, 58, 58] 
max_indices = [i for i in range(len(my_list)) if my_list[i] == max(my_list)]

编辑: 阿什维尼是对的。 max() 需要在列表之外,所以...

max_value = max(my_list)
max_indices = [i for i in range(len(my_list)) if my_list[i] == max_value]

【讨论】:

我认为 enumerate 比索引更 Pythonic。但它可能不是 是 O(N^2) 因为 max() 在列表中吗? 是的:每次调用max() 都是O(n),而您则调用n 次。 @AshwiniChaudhary 和 jonrsharpe,python 有那么笨吗? :p 我们不应该假设它很聪明,我只是在问。 @ᴋᴇʏsᴇʀ 我们可以使用任何我们想要的max 函数轻松隐藏max,因此Python 无法优化这些东西。【参考方案4】:

枚举将帮助您获取值和位置

maxx = max(my_list)
for i,j in enumerate(my_list):
    if j == maxx:
        print i,j

输出

5 58

10 58

11 58

【讨论】:

以上是关于如何在绑定数字的列表中找到最大数字的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中,如何有效地找到列表中不一定相邻的最大连续数字集?

如何从数组中的数字中找到最大和最小数字[重复]

AS3 - 如何在数组中找到两个最大的数字

在列表中找到相同数字的最大连续出现而不导入任何模块

如何在 Pig 和 Hive 中找到第 n 个最大和最小的数字?

如何在python 3中找到列表中所有数字的因数? [关闭]