Python 3.x数组,使用排名逻辑的新数组

标签 python python-3.x list

假设排序列表的值介于 -20 到 20 之间:

[20,19,19,17,14,12,12,12,10,1,1,1,-1,-2,-2,-2,-2,-7,-9,-15,-16]

我需要创建一个新列表,计算每个项目在正数或负数上下文中的排名。换句话说,将有两种排名范围(一种用于正面项目,一种用于负面项目)。排名的范围取决于数组中有多少项是正数/负数。我想使用逆排序逻辑;值越高,排名越低。

使用上面的示例,20 将排在最后,因为它是最大的。更准确地说,“最后一名”将是第 12 位(因为列表中有 12 项是积极的)。按照同样的逻辑,1 将是第一名(我猜这不是我们选择哪个 1 的生死存亡)。同样,-16 应该是负数的最后一个位置(第 9 个位置)(有 9 个负数项)。为了清楚起见,我想使用负号来区分负排名和正排名。因此 -16 将变为 -9-15 将变为 -8-9 code> 将变为 -7 等。

预期输出:

[12,11,10,9,8,7,6,5,4,3,2,1,-1,-2,-3,-4,-5,-6,-7,-8,-9]

问题

如何使用 native python 构建具有上述排名逻辑的新列表?

  • 注意:列表中正面项目/负面项目的数量比例可能会发生变化。在本例中,有 12 个正面项目和 9 个负面项目,但我需要一种对于一般情况而言稳健的方法。举个例子,18 个阳性和 3 个阴性,或者 3 个阳性和 18 个阴性。

最佳答案

这样就完成了:

a = [20,19,19,17,14,12,12,12,10,1,1,1,-1,-2,-2,-2,-2,-7,-9,-15,-16]

positive = sum(1 for i in a if i >= 0)
negative = sum(1 for i in a if i < 0) + 1

result = list(range(positive, 0, -1)) + list(range(-1, -negative, -1))

result
#[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -1, -2, -3, -4, -5, -6, -7, -8, -9]

关于Python 3.x数组,使用排名逻辑的新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057816/

相关文章:

python - Python 文本文件中的排行榜

python - 类名作为幂等类型转换函数

python - 如何初始化先验未知数量的列表

java - 如何从 Java 中的另一个类调用某些内容并使用它的数组?

python - 返回 Python 中最低有效位的索引

python-3.x - 如何在绘图中获取生成的 x 轴和 y 轴范围?

python - 将函数链接到模型条目

python - python中变量的大小

python - 我如何在 gdb 中使用 python 访问寄存器

python - 从 GUI 类外部访问 GUI 元素