【问题标题】:How could I write a function to find fractional ranking of a list of numbers?我如何编写一个函数来查找数字列表的分数排名?
【发布时间】:2021-05-10 05:56:01
【问题描述】:

我正在尝试用 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

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您可以尝试使用哈希映射 - defaultdict dictionary 来存储每个数字及其位置,然后循环进行排名计算。

标签: python list ranking ranking-functions


【解决方案1】:

@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... 

【讨论】:

    【解决方案2】:

    这是一个想法:

    您可以使用x.count(1) 查看列表中有多少个数字 1,x.count(2) 查看数字 2 等等。

    另外,永远不要使用 sum 作为变量名,因为它是一个内置函数。

    也许使用 2 个 for 循环。第一个将遍历列表 x 中的元素,第二个还将遍历列表 x 中的元素,如果找到相同的元素,则将其附加到 new_list。 然后,您可以使用 sum(new_list) 之类的内容,并在每次迭代后清除列表。

    如果您在遍历 x 时使用索引,您甚至不需要遍历列表 n for i, y in enumerate(x) 所以你可以使用 n[i] 来读取值

    如果你想要代码,我会在评论中发布它

    【讨论】:

    • 我能够编写代码来更改元素的出现。列表 [1,1,1,2,3,3] 变为 [3,3,3,1,2,2]。我不知道如何在 cmets 中粘贴代码。但我听从了你的建议,不要使用 sum 作为变量。我想知道是否有办法对子集求和。如果我有一个列表,例如 [3,2,5,8,6,9,2] 我怎么能只求和 [5,8,6]?我仍然无法关联两个列表。我将不胜感激!
    • new_sum = x[2] + x[3] + x[4] 使用他们在列表中的位置。索引从 0 开始。因此,如果您想要列表中的第三个元素,它的索引将是 2,并且要访问该元素,您可以使用 x[2]
    【解决方案3】:

    好的,首先,对于您的 for 循环,您只需说出 for i in x: 就可以更轻松地遍历列表中的每个元素。至少对我来说,这会让它更容易阅读。然后,要获得排名,可能会使用嵌套的 for 循环再次循环并检查它是否等于您当前所在的任何元素。我不知道这是否有意义;我不想提供太多细节,因为你说你不想要完整的解决方案(如果你想让我解释得更好,一定要回复)。

    【讨论】:

    • 我能够创建一个函数,通过它的出现来改变每个值。例如,列表 [1,1,1,2,3,3,5,6,6,6] 变为 [3,3,3,1,2,2,1,3,3,3]。我想知道我是否可以对子集求和。例如,我有列表 [1,2,3,4,5,6],我只想求和 [3,4,5]。这肯定会解决问题。但我不知道如何将列表中的元素关联到列表中。我将不胜感激!
    猜你喜欢
    • 2022-12-07
    • 2018-12-29
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多