首页 > 解决方案 > 我如何编写一个函数来查找数字列表的分数排名?

问题描述

我正在尝试用 Python 编写代码来为给定的分数创建分数排名列表。分数排名基本如下:

我们有一个数字列表x = [4,4,10,4,10,2,4,1,1,2]

首先,我们需要按升序对列表进行排序。我将为此使用插入排序,我已经编写了这部分代码。

现在我们有了排序列表x = [1, 1, 2, 2, 4, 4, 4, 4, 10, 10]。该列表有 10 个元素,我们需要将其与前 10 个自然数的列表进行比较n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

对于 x 中的每个元素,我们分配一个值。请注意,数字 1 出现在位置 1 和 2。因此,数字 1 的排名为 (1 + 2) / 2 = 1.5。

数字 2 出现在位置 3 和 4,因此它的排名为 (3 + 4) / 2 = 3.5。

数字 4 出现在位置 5、6、7 和 8,因此它获得排名 (5 + 6 + 7 + 8) / 4 = 6.5

数字 10 出现在位置 9 和 10,因此它获得排名 (9 + 10) / 2 = 9.5

在这个过程的最后,我们需要一个新的排名列表r = [1.5, 1.5, 3.5, 3.5, 6.5, 6.5, 6.5, 6.5, 9.5, 9.5]

我不想要一个完整的解决方案,我想要一些技巧来指导我,同时写下代码。

我正在尝试使用该for函数使用原始列表中的元素创建一个新列表,但我的第一次尝试失败了。我试图至少让第一个元素正确,但它没有按预期工作:

# Suppose the list is already sorted.
def ranking(x):
    l = len(x)
    for ele in range(1, l):
        t = x[ele-1]
        m = x.count(t)
        i = 0
        sum = 0
        while i < m:  # my intention was to get right at least the rank of the first item of the list
              sum = sum + 1 
              i = i + 1
        x[ele] = sum/t
    return x

关于如何解决这个问题的任何想法?

标签: pythonlistrankingranking-functions

解决方案


@VictorPaesPlinio-您是否可以尝试此示例代码来解决该问题:(这是部分解决方案,数据聚合是否有效,最后一部分留给put the output您自己练习)。

from collections import defaultdict

x = [4, 4, 10, 4, 10, 2, 4, 1, 1, 2]
x.sort()

print(x)

lst = list(range(1, len(x)+1))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ranking = defaultdict(list)

for idx, num in enumerate(x, 1):
    print(idx, num)
    ranking[num].append(idx)


print(ranking)
'''defaultdict(<class 'list'>, {1: [1, 2], 2: [3, 4],
                                4: [5, 6, 7, 8], 10: [9, 10]})
'''

r = []
# r = [1.5, 1.5, 3.5, 3.5, 6.5, 6.5, 6.5, 6.5, 9.5, 9.5]
#       1    1    2    2    4    4    4    4    10   10

for key, values in ranking.items():
    # key is the number, values in the list()
    print(key, values, sum(values))
    

输出:

1 [1, 2] 3
2 [3, 4] 7
4 [5, 6, 7, 8] 26
10 [9, 10] 19               # then you can do the final outputs part... 

推荐阅读