【问题标题】:Sort a list then give the indexes of the elements in their original order对列表进行排序,然后按原始顺序给出元素的索引
【发布时间】:2014-08-28 02:02:43
【问题描述】:

我有一个包含 n 个数字的数组,比如 [1,4,6,2,3]。排序后的数组是[1,2,3,4,6],这些数字在旧数组中的索引是0、3、4、1和2。给定n个数字的数组,找到这个索引数组的最佳方法是什么?

我的想法是为每个元素运行订单统计信息。但是,由于我必须多次重写这个函数(在比赛中),我想知道是否有一种捷径可以做到这一点。

【问题讨论】:

  • 你能展示一下你所做的尝试吗?
  • 如果你颠倒任务的定义,你会得到和这里一样的:stackoverflow.com/questions/3071415/…
  • 这个问题的例子有点模棱两可。您可能希望执行两种操作。 1.) 对于原始列表中的每个元素,获取该元素在排序列表中的位置。 2.) 对于排序列表中的每个元素,获取该元素在原始列表中的位置。在您的示例中,排序数组索引 [0,3,4,1,2] 满足这两个任务,但通常情况并非如此。例如,给定输入列表[1,6,4,2,3],任务1的输出是[0,4,3,1,2],任务2的输出是[0,3,4,2,1]

标签: python list sorting


【解决方案1】:
>>> a = [1,4,6,2,3]
>>> [b[0] for b in sorted(enumerate(a),key=lambda i:i[1])]
[0, 3, 4, 1, 2]

解释:

enumerate(a) 返回由原始列表中的索引和值组成的元组的枚举:[(0, 1), (1, 4), (2, 6), (3, 2), (4, 3)]

然后sortedlambda i:i[1] 中的key 根据原始值(每个元组的第1 项)进行排序。

最后,列表推导 [b[0] for b in ...] 返回原始索引(每个元组的第 0 项)。

【讨论】:

  • 这将创建一个枚举列表,根据原始键对其进行排序,然后返回关联的索引。在速度和代码长度方面非常有效的解决方案。
  • 为什么谢谢你。我可能应该评论它,谢谢,列表推导可能有点难以消化。
【解决方案2】:

如果您要对数据进行大量统计,则使用 numpy 数组而不是列表可能会有所帮助。如果您选择这样做,这将起作用:

import numpy as np
a = np.array( [1,4,6,2,3] )
b = np.argsort( a )

argsort() 也可以对列表进行操作,但我相信在这种情况下,它只是先将数据复制到数组中。

【讨论】:

    【解决方案3】:

    这是另一种方式:

    >>> sorted(xrange(len(a)), key=lambda ix: a[ix])
    [0, 3, 4, 1, 2]
    

    这种方法不是对原始列表进行排序,而是对它的索引(使用xrange 创建)进行排序,使用原始列表作为排序键。

    【讨论】:

    • 如果您要生成完整的索引列表以便对其进行排序,为什么要使用xrange 而不是range
    • @MarkReed:我相信sorted 会一次消耗xrange 一个元素。这意味着只会生成一个列表(排序后的版本);未排序的索引列表不会被预先生成和存储。
    【解决方案4】:

    这应该可以解决问题:

    from operator import itemgetter
    indices = zip(*sorted(enumerate(my_list), key=itemgetter(1)))[0]
    

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 2021-04-15
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2018-09-23
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多