保持索引不变,按升序排序



我有一个数字列表,我想按升序排列,但它们的索引很重要,我想保持它们不变。

例如:

index 0  1 2 3  4  5  6 7 8  9
a =  [22,2,4,53,43,32,3,5,1,101] 

:

index  8 1 6 2 7  0  5 4  3   9
a =   [1,2,3,4,5,22,32,43,53,101] 

怎么排列?

感谢

基本上,我的答案是添加到Alex的(在我留下这个评论2分钟后发布)

。内置enumerate()函数,生成iterable中每个项目的索引和值的元组,您可以将其结果直接传递给sorted(),itemgetter(1)作为key参数。它将返回一个元组(index, value)的列表,按第二个元素(value)排序。

要从配对列表中获得两个单独的列表,您可以将list解包到zip()中,并将结果分配给两个单独的变量。

代码:

from operator import itemgetter
a = [1,2,3,4,5,22,32,43,53,101]
indexes, values = zip(*sorted(enumerate(a), key=itemgetter(1)))

您可以将列表重新创建为(index, value):

的元组列表。
>>> arr = list(enumerate(a))
>>> arr
[(0, 22),
(1, 2),
(2, 4),
(3, 53),
(4, 43),
(5, 32),
(6, 3),
(7, 5),
(8, 1),
(9, 101)]

然后您可以按原始索引或使用0索引和1值排序:

>>> sorted(arr, key=lambda x: x[1])
[(8, 1),
(1, 2),
(6, 3),
(2, 4),
(7, 5),
(0, 22),
(5, 32),
(4, 43),
(3, 53),
(9, 101)]

或者使用itemgetter,如@Olvin right所建议的

>>> from operator import itemgetter
>>> sorted(arr, key=itemgetter(1))

根据定义,列表中元素的索引是它在列表中的位置。如果您希望保留原始索引作为信息,可以将列表的元素更改为长度为2的元组/列表,第一个元素作为值,索引作为第二个元素。

a = [1,2,3,4,5,22,32,43,53,101]
# adding original index to each element
for i in range(len(a)):
a[i] = (a[i],i)
# sorting the list based on the first number in each element
def compare(x):
return -x[0]
a.sort(key=compare)
print(a)

编辑:根据评论和其他答案的建议,您可以使用内置函数和更紧凑的语法替换一些代码:

  • 您可以enumerate构造函数枚举列表,然后使用list构造函数
  • 从对象中生成列表
  • 可以用一个紧凑的lambda代替比较函数。像lambda x : x[1]虽然我通常会在编码时进行这些更改,但我试图使代码尽可能简单,以便理解,以防您不熟悉上面描述的一些函数。

最新更新