【问题标题】: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等……

【问题讨论】:

标签: python list sorting indexing max


【解决方案1】:

你可以用max来确定maxval

maxval = max(my_list)

然后使用enumeratelist 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2019-09-10
      • 2016-09-08
      相关资源
      最近更新 更多