gpt4 book ai didi

python - 对数字列表进行排名,允许并列

转载 作者:行者123 更新时间:2023-12-05 08:42:23 31 4
gpt4 key购买 nike

假设我有一个这样的列表:

newIndexVertList = [0, 1, 2, 2, 1, 20, 21, 21, 20, 3, 23, 22]

我想把它转换成:

newIndexVertList = [0, 1, 2, 2, 1, 4, 5, 5, 4, 3, 7, 6]

在这里,转换是基于数字在原始列表中按升序排列的位置。因此,在新的列表中,数字根据以下逻辑被替换:

0   -->  0    0th position in sorted list
1 --> 1 1st position in sorted list
2 --> 2 2nd position in sorted list
3 --> 3 3rd position in sorted list
20 --> 4 4th position in sorted list
21 --> 5 5th position in sorted list
22 --> 6 6th position in sorted list
23 --> 7 7th position in sorted list

下面是我实现这个的代码:

c = 0
for i in xrange(len(newIndexVertList)):
if c < newIndexVertList[i]:
newIndexVertList[i] = c
c += 1
continue
elif c == newIndexVertList[i]:
c += 1
continue
else:
continue

# actual output: [0, 1, 2, 2, 1, 3, 4, 5, 6, 3, 7, 8]
# expected output: [0, 1, 2, 2, 1, 4, 5, 5, 4, 3, 7, 6]

我的代码有什么问题?实现这一目标的优雅方法是什么?

由于我的顶点列表将在 100k 范围内,我正在寻找最快的执行速度。

最佳答案

您可以通过创建中间体 dict 来实现它对象通过使用 sorted() 将数字与其在原始列表中的位置映射和 set()enumerate() :

>>> my_list = [0, 1, 2, 2, 1, 20, 21, 21, 20, 3, 23, 22]
>>> num_map = {j: i for i, j in enumerate(sorted(set(my_list)))}
# ^ ^ to get unique elements
# ^ sort numbers in ascending order

>>> [num_map[n] for n in my_list]
[0, 1, 2, 2, 1, 4, 5, 5, 4, 3, 7, 6]

正如 Stefan 评论的那样, 可以使用 map() 在线实现作为:

list(map({j: i for i, j in enumerate(sorted(set(my_list)))}.get, my_list))
# ^ type-cast `map` object to `list` for Python 3.x compatibility

关于python - 对数字列表进行排名,允许并列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955015/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com