【问题标题】:How can I get the position from smaller number to biggest number of list?我怎样才能从较小的数量到最大的列表数量?
【发布时间】:2021-03-12 13:51:22
【问题描述】:

我知道我的问题似乎令人困惑,但假设我有以下列表:

List1 = [15,16,1,2]

所以,[ 15, 16, 1, 2 ] 的位置是[ 0, 1, 2, 3 ]

我正在寻找的是一个结果列表,其中包含从 list1 的最小数量到最大的位置。

Result List = [2,3,0,1]

我不知道在 Python 中最有效的方法。

【问题讨论】:

  • [15, 16, 17, 1, 2] 的结果应该是什么?

标签: python arrays list sorting


【解决方案1】:

enumeratesorted 与使用lambda expression 的自定义键一起使用:

List1 = [15,16,1,2]

v  = [i for i,_ in sorted(enumerate(List1), key=lambda x:x[1])]

print(v)

输出:

[2,3,0,1]

enumerate(List1) 生成 (index, value) 的元组,这些元组根据 value 进行排序,然后仅使用 index 来创建结果列表。

【讨论】:

  • 有更短且性能更好的解决方案,除了输出列表之外,不需要创建额外的列表(元组)。看我的回答。
【解决方案2】:

您想要的在某些库中称为argsort。用数学术语来说,您需要一个“排列”(在维基百科上查找),当应用于输入列表时会给出一个排序列表。

在 Python 中执行此操作的最佳方法如下:

def argsort(lst):
    return sorted(range(len(lst)), key=lst.__getitem__)

lst = [15,16,1,2]
print(argsort(lst))
# print: [2, 3, 0, 1]

这就是它的工作原理。不是对lst 中的值进行排序,而是使用相应的lst 值作为“键”对索引(range(0, len(lst))) 进行排序。 请记住,lst.__getitem__(i) 仅等同于 lst[i]

编辑:对于 Python 新手和不熟悉“key”参数和 Python 的神奇方法(如__this__)的人来说,这可能令人生畏。更友好的版本可能是:

def argsort(lst):
    indexes = range(len(lst))
    return sorted(indexes, key=lambda i: lst[i])

【讨论】:

  • 如果内存和空间真的很重要,性能会比我的好。不错 - 仍然认为我的更容易掌握:D)
  • 我不同意 :)。这在时间和空间上都表现得更好,而不会增加额外的复杂性或代码。您的解决方案实际上是在做同样的事情(排序的关键参数是相同的)添加两个额外的不必要步骤:创建元组(索引,值)和从已排序的元组列表中提取索引。我同意使用 lst.__getitem__ 加上我没有给范围命名(“索引”)这一事实可能会让 Python 新手感到害怕。我会扩大我的答案......
  • 是的,第一个更容易理解逻辑..但我最终使用了第二个,因为我正在处理相对大量的数据。谢谢两位!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多