【问题标题】:How to randomly return the index of one of the maximum elements in a list in Python?如何在 Python 中随机返回列表中最大元素之一的索引?
【发布时间】:2025-11-30 22:15:01
【问题描述】:

我的程序计算 3 个不同值出现的次数,并将它们存储在像这样的列表中 classes = [class1,class2,class3]

我想返回最大值的索引,但是这些值经常会重复。如果是这种情况,我想返回一个在最大值之间随机选择的索引。

例如,如果我有classes = [5,2,5],我想输出 0 或 2。 如果我有classes = [1,1,1],0,1 和 2 就可以了。 最后,如果我有classes = [1,10,1],我想输出1。

到目前为止,我已经从其他问题中拼凑出这一点,但它的行为不是我想要的,我不明白为什么。

classes = [class1,class2,class3]
dupes = [n for n, x in enumerate(classes) if x in classes[:n]]
class_prediction = dupes[random.randint(0,len(dupes))] + 1

(最后的+1是返回实际的类标签而不是索引。)

【问题讨论】:

  • 澄清一下,你真的需要随机选择其中一个吗? (不是,例如,只返回第一个最大值的索引可以吗?)
  • @smarx 是的,完全正确。如果我总是返回第一个,class1 将在我的结果中出现过多。 (我正在实现一个 KNN 算法)

标签: python python-2.7 random max


【解决方案1】:

您可以将random.choice 与列表理解一起使用,如下所示

indices = [idx for idx, val in enumerate(values) if val == largest]
random.choice(indices)

举个例子,这里是调用几次的结果

>>> import random
>>> values = [5, 2, 5, 3, 1]
>>> largest = max(values)
>>> indices = [idx for idx, val in enumerate(values) if val == largest]
>>> random.choice(indices)
2
>>> random.choice(indices)
0
>>> random.choice(indices)
2

【讨论】:

  • 这很好而且很短,但是如果list 很长,它的效率会有点低。 (它查看所有值一次以确定最大值,然后再次查看它们以找到匹配的索引。)仅供参考,不一定是批评。
  • @smarx 从计算复杂度的角度来看,它效率低下,但是,由于max 以 C 速度运行,因此对于中小型列表的开销可以忽略不计,并且肯定比使用 for 循环取最大值要快。
  • 就我而言,这应该不是什么大问题,因为最大尺寸是 10 :D
【解决方案2】:

可能有更好的解决方案,但这里有一个相当“手动”的方法,应该很容易理解:

import random

def get_random_max(classes):
    maximum_indexes = []
    maximum_value = None

    for i, n in enumerate(classes):
        if maximum_value is None or n > maximum_value:
            maximum_value = n
            maximum_indexes = [i + 1]
        elif n == maximum_value:
            maximum_indexes.append(i + 1)

    return random.choice(maximum_indexes)

print(get_random_max([5, 2, 5]))  # prints 1 or 3 with equal probability

【讨论】:

  • 感谢您的回答,它帮助我理解了问题背后的逻辑!
最近更新 更多