python - 如何找到赢家通吃的最高值(value)

标签 python algorithm sorting

如何在python中轻松实现K-winner take all?

我有一个具有不同值的数组:[0, 8, 0.3, 0.2, ...]

我希望将具有最高值的 k 元素设置为 1,将其他元素设置为 0

对于 k=0.3,如果有 100 个值,则最后 30 个(具有最高值)为 1,其他均为 0

最佳答案

l 成为原始列表(“数组”)

对于 k==1/len(l)(只有一个最大数),这很容易。

关键实现是算法可以分解为三部分:

  • 寻找最大元素
  • 创建一个所有元素都设置为 0
  • 的新列表
  • 将正确的元素设置为 1(在新列表中)

这些步骤很容易单独执行。如果您需要任何这些方面的帮助,请随时提出另一个问题(确保检查之前是否有人问过)。


为任意 k 编写一个高效算法更复杂,但我假设您更看重简单性而非性能(因为您是用 python 编写的)

  • jlen(l)*k(您想要的最大值的元素数)
  • 按降序排列列表
  • threshold 为已排序列表中第j 个元素的值。这是您要设置为 1 的最小元素的索引。
  • 创建一个所有元素都设置为 0 的新列表
  • 将所有元素 >= threshold 设置为 1(在新列表中)

一个稍微复杂但 pythonic 的实现:

#-----input
l=[1,6,2,5,3,4]
k=0.5
#---------
j= int(len(l)*k)
threshold= sorted(l)[j]
result= [int(x>=threshold) for x in l]

输出:[0, 1, 0, 1, 0, 1]

关于python - 如何找到赢家通吃的最高值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31586729/

相关文章:

c++ - 优化 SphereInFrustrum 检查

performance - 快速乘法

javascript - 如果将项目放入数组并排序,则确定项目的潜在索引。

python - 在从元类调用的类方法中调用 `super`.__new__

python - MySQL-python,错误: command 'gcc-4.2' failed with exit status 1

algorithm - 如何在 Canvas 中仅绘制具有自定义颜色的 > 0% alpha 的可见像素?

c++ - 带有数字问题的自然排序文件名 C++

python - 如何从 channel 名称或 url 检索 channel ID

python - 如何在Python中的字典列表中的键和值的末尾附加空格

c++ - C++中的排序链表