【问题标题】:How to sort a list of integers numerically while retaining value order [duplicate]如何在保持值顺序的同时对整数列表进行数字排序[重复]
【发布时间】:2018-04-04 17:21:21
【问题描述】:

假设我有一个列表[102, 97, 116, 101],我想对它们的值进行数字排序,同时保留值在列表中的位置,如[3, 1, 4, 2]。我该怎么办?

【问题讨论】:

  • 输入列表中的数字都是唯一的吗?
  • 数字是从字符串中字符的 ASCII 值生成的(英文单词,仅限字母)。所以列表可以是一个范围的值,也可以有重复的值。如果两个数字相同(即:[51, 35, 51] 他们将被订购[1, 2, 3])。所以它们在这方面是独一无二的。

标签: python


【解决方案1】:

将在查找时键入的索引输入排序到您现有的list

>>> 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 索引)。

【讨论】:

  • 如果您想要元素和排名,请改用enumeratesorted(enumerate([102, 97, 116, 101], 1), key=lambda x: x[1], reverse=True)
  • 这可以通过使用0作为索引并且只将1添加到lambda函数的结果来简化。
  • @HubertGrzeskowiak:嗯? lambda 的结果是键值;添加一个是没有意义的。 OP 的预期输出是 1-up,因此如果您使用 0-up 索引而不使用减法(这会让您稍微使用 key=mylist.__getitem__速度提升)。
【解决方案2】:

我们可以在未排序的列表中排序并获取item的索引:

sorted_list = sorted([102, 97, 116, 101])
[sorted_list.index(e) for i, e in enumerate([102, 97, 116, 101])]

输出

[2, 0, 3, 1]

如果要从 1 开始索引,只需添加一个即可:

[sorted_list.index(e)+1 for i, e in enumerate([102, 97, 116, 101])]

输出

[3, 1, 4, 2]

【讨论】:

  • 这是对列表进行 n 次排序(n 是序列中的元素个数?)
  • @ReblochonMasque 好点,如果你想要更高的效率,你可以在列表理解之外做一次并重新使用结果
【解决方案3】:

这是唯一编号列表的一种可能方式:

  1. 创建列表的副本并对其进行排序(反向)。叫它sorted_list
  2. 创建第三个空列表result
  3. 遍历输入列表,找到sorted_list列表中每个数字的索引。
  4. 将该索引附加到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]

【讨论】:

  • 这假定原始序列中没有重复。
  • @ReblochonMasque 正确。因此我对这个问题的评论。
  • 请不要命名阴影内置插件;你在这里做了两次,inputsorted
  • @ShadowRanger 谢谢。固定
猜你喜欢
  • 2018-10-05
  • 2021-12-23
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2020-04-05
  • 1970-01-01
相关资源
最近更新 更多