假设排序列表的值介于 -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/