如何在绑定数字的列表中找到最大数字
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))
,但这只会给我第一个索引。
有什么建议吗?另外,我想坚持简单的方法,如sort
、max
、len
等……
【问题讨论】:
另见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
,一次找到匹配的 index
es):
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 中,如何有效地找到列表中不一定相邻的最大连续数字集?