Python 如何在保留值顺序的同时对整数列表进行数字排序
假设我有一个列表Python 如何在保留值顺序的同时对整数列表进行数字排序,python,Python,假设我有一个列表[102,97,116,101],我想对它们的值进行数字排序,同时保留值在列表中的位置,如[3,1,4,2]。我该怎么做呢?将查找时键入的索引输入排序到现有的列表中: >>> mylist = [102, 97, 116, 101] >>> ranks = sorted(range(1, len(mylist)+1), key=lambda i: mylist[i-1], reverse=True) >>> print(ran
[102,97,116,101]
,我想对它们的值进行数字排序,同时保留值在列表中的位置,如[3,1,4,2]
。我该怎么做呢?将查找时键入的索引输入排序到现有的列表中
:
>>> mylist = [102, 97, 116, 101]
>>> ranks = sorted(range(1, len(mylist)+1), key=lambda i: mylist[i-1], reverse=True)
>>> print(ranks)
[3, 1, 4, 2]
使用
i-1
作为索引是因为您使用了1-up列(而Python使用0-up索引)。以下是一种可能的唯一数字列表方法:
result
排序列表中找到每个数字的索引
结果
列表中input_list = [102, 97, 116, 101]
sorted_list = [97, 101, 102, 116]
result = [1, 3, 0, 2]
如果希望结果从1
开始,而不是从0
开始,请将1
添加到索引中
实施:
input_list = [102, 97, 116, 101]
sorted_list = sorted(input_list, reverse=True)
result = []
for n in input_list:
result.append(sorted_list.index(n))
# result now contains [1, 3, 0, 2]
我们可以对未排序列表中项目的索引进行排序和抓取:
sorted_list = sorted([102, 97, 116, 101])
[sorted_list.index(e) for i, e in enumerate([102, 97, 116, 101])]
输出
[2, 0, 3, 1]
[3, 1, 4, 2]
如果要从1开始索引,只需添加一个:
[sorted_list.index(e)+1 for i, e in enumerate([102, 97, 116, 101])]
输出
[2, 0, 3, 1]
[3, 1, 4, 2]
输入列表中的数字是否都是唯一的?这些数字是由字符串中字符的ASCII值生成的(仅英文单词,字母)。因此,列表可以是一系列值,也可以有重复的值。如果两个数字相同(即:
[51,35,51]
,则将对它们进行排序[1,2,3]
)。所以它们在这方面是独一无二的。这假设在原始序列中没有重复。@ReblochonMasque正确。因此,我对这个问题的评论是:请不要说出影子内置的名字;您在这里已经做了两次,分别是input
和sorted
@ShadowRanger-thx。修复如果您想要元素和排名,请使用enumerate
代替:排序(enumerate([102,97,116,101],1),key=lambda x:x[1],reverse=True)
这可以通过使用0
作为索引并仅向lambda函数的结果添加1
来简化。@HubertGrzeskowiak:Huh?lambda
的结果是键值;增加一个是没有意义的。OP的预期输出是1向上的,因此如果使用0向上索引而不进行减法(这将允许您使用key=mylist.\uu getitem\uuuu
),则需要将一个添加到sorted
(而不是lambda
)的结果中,以略微提高速度。这是将列表排序n次(n序列中的元素数?)@ReblochonMasque很好,如果你想要更高的效率,你可以在列表理解之外再做一次,并重复使用结果