我有一个数字列表,我想按升序排列,但它们的索引很重要,我想保持它们不变。
例如:
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]
虽然我通常会在编码时进行这些更改,但我试图使代码尽可能简单,以便理解,以防您不熟悉上面描述的一些函数。