【问题标题】:How to get list of indices for elements whose value is the maximum in that list如何获取其值为该列表中最大值的元素的索引列表
【发布时间】:2017-02-12 06:21:18
【问题描述】:

假设我有一个列表l=[3,4,4,2,1,4,6] 我想获得这个列表的一个子集,其中包含值为 max(l) 的元素的索引。 在这种情况下,索引列表将为[1,2,5]

我正在使用这种方法来解决一个问题,例如,提供了一个数字列表

l=[1,2,3,4,3,2,2,3,4,5,6,7,5,4,3,2,2,3,4,3,4,5,6,7]

我需要确定一个元素的最大出现次数,但是如果超过 1 个元素出现相同的次数, 我需要选择量级更大的元素, 假设我在 l 上应用一个计数器并得到{1:5,2:5,3:4...},我必须选择“2”而不是“1”。 请建议如何解决这个问题

编辑- 问题是这样开始的, 1) 提供一个列表作为输入

l=[1 4 4 4 5 3]

2)我对此运行一个计数器来获取每个唯一元素的计数

3)我需要获取值为最大值的key

4)假设Counter对象包含多个值为最大值的条目, 如Counter{1:4,2:4,3:4,5:1} 我必须选择 3 作为值为 4 的键。

5) 到目前为止,我已经能够获取 Counter 对象,我已经使用 k=counter.keys();v=counter.values() 分离了键/值列表

6)我想获取在 v 中值为最大值的索引 如果我运行v.index(max(v)),我得到第一个值与最大值匹配的索引,但我想获取值为max的索引列表,以便我可以获得对应的键列表并获得最大值键入该列表。

【问题讨论】:

  • 您的问题不清楚,请更清楚地说明您的输入和期望的输出。
  • 你能解释一下你是如何在 4 中从 l 变成 Counter 字典的吗?
  • @Giridhur 我从集合中导入 Counter,并将列表作为参数发送给 Counter。这将返回一个 Counter 对象。与 4 一样,我刚刚使用了一个示例,它可能与 1 中指定的列表无关

标签: python-3.x


【解决方案1】:

对于长列表,使用 NumPy 或任何其他线性代数会有所帮助,否则您可以简单地使用任何一个

l.index(max(l))

max(range(len(l)),key=l)

然而,这些只返回众多 argmax 之一。

因此,对于您的问题,您可以选择反转数组,因为您希望稍后出现的最大值为:

len(l)-l[::-1].index(max(l))-1

【讨论】:

  • n-l[::-1].index(max(l))-1 ;你能解释一下这个公式吗? n是什么
  • 所以,首先我们找出最大元素的值,然后我们逆向列表,找出最大元素的位置,然后得到最大元素的索引。跨度>
【解决方案2】:

如果我理解正确,以下应该做你想要的。

from collections import Counter

def get_largest_most_freq(lst):
    c = Counter(lst)
    # get the largest frequency
    freq = max(c.values())
    # get list of all the values that occur _max times
    items = [k for k, v in c.items() if v == freq]
    # return largest most frequent item
    return max(items)

def get_indexes_of_most_freq(lst):
    _max = get_largest_most_freq(lst)
    # get list of all indexes that have a value matching _max
    return [i for i, v in enumerate(lst) if v == _max]

>>> lst = [3,4,4,2,1,4,6]
>>> get_largest_most_freq(lst)
4
>>> get_indexes_of_most_freq(lst)
[1, 2, 5]
>>> lst = [1,2,3,4,3,2,2,3,4,5,6,7,5,4,3,2,2,3,4,3,4,5,6,7]
>>> get_largest_most_freq(lst)
3
>>> get_indexes_of_most_freq(lst)
[2, 4, 7, 14, 17, 19]

【讨论】:

  • @AshwinV 如果这解决了您的问题,请随时接受。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2021-11-07
  • 2013-12-03
相关资源
最近更新 更多