在python中按秩对整数列表排序

2024-03-28 10:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个函数,它计算每个数字的数量 元素小于它(这是数字的秩),然后将数字放入排序列表中的秩中。假设我有一张清单

L=(4,7,9,10,6,11,3)

我想要的是一个对应的列表

K=(1,3,4,5,2,6,0)

其中,元素K[i]具有L中对应位置元素的“秩”值。我编写了以下代码:

def sort_by_rank(lst):
    for i in range(len(lst)):
        # rank = how many elements are smaller than lst[i]?
        rank = 0
        for elem in lst:
            if elem < lst[i]:
                rank += 1
        lst[rank] = lst[i]
    return lst

但它有一个我无法调试的bug


Tags: 函数代码in元素列表for数量by
3条回答

更简单的方法是创建列表的排序副本,然后获取索引:

L = [4,7,9,10,6,11,3]
s = sorted(L)
result = [s.index(x) for x in L]  # [1, 3, 4, 5, 2, 6, 0]

现在,这是一种幼稚的方法,它对像您这样的小列表非常有效,但是对于长列表,它会很慢,因为list.index相对来说比较慢,而且它被反复运行

为了提高效率,可以使用enumerate生成元素索引对的dict。dict中的查找比list.index快得多

s = {x: i for i, x in enumerate(sorted(set(L)))}
result = [s[x] for x in L]  # [1, 3, 4, 5, 2, 6, 0]

在这里,我还将L转换为一个集合,以防重复,否则以后的出现将覆盖早期出现的索引

为了获得更有效的方法,您可以使用enumerate为要一起排序的项创建索引,然后使用另一个enumerate为排序序列创建索引,以将旧索引映射到已排序的索引作为dict,然后在列表范围内迭代索引,以在列表中输出新索引:

L=(4,7,9,10,6,11,3)
d = {o: i for i, (o, _) in enumerate(sorted(enumerate(L), key=lambda t: t[1]))}
print([d[i] for i in range(len(L))])

这将产生:

[1, 3, 4, 5, 2, 6, 0]

首先,您的LK不是列表,而是元组。您的代码可能出现错误,因为您试图修改元组中的值

您可以使用map函数将每个元素映射到小于它的数字量

result = list(map(lambda item: sum([number < item for number in L]), L))

知道当计算TrueFalse之和时,True与1相同,而False与0相同。通过计算新列表的总和,其中每个元素都是True/False,这取决于项是否大于数字,我们基本上是在计算列表中有多少True,这应该是您要问的


我的道歉,没有看到你需要的部分,你的编号按等级排序。您可以使用key参数对其进行排序

L = [(item, sum([number < item for number in L])) for item in L]
L.sort(key=lambda item: item[1])

其中L中的每个元素都转换为元组(原始的_值,其_秩)

相关问题 更多 >