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很好,如果你想要更高的效率,你可以在列表理解之外再做一次,并重复使用结果