Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按序列元素在排序副本中的显示位置对其进行索引_Python_Sorting_Python 3.x_Magnitude - Fatal编程技术网

Python 按序列元素在排序副本中的显示位置对其进行索引

Python 按序列元素在排序副本中的显示位置对其进行索引,python,sorting,python-3.x,magnitude,Python,Sorting,Python 3.x,Magnitude,我有一个整数列表,例如: my_list = [5, 2, 4, 9] >>> from operator import itemgetter >>> second_item = itemgetter(1) >>> my_list = [5, 2, 4, 9] >>> sorted(enumerate(my_list), key=second_item) [(1, 2), (2, 4), (0, 5), (3, 9)]

我有一个整数列表,例如:

my_list = [5, 2, 4, 9]
>>> from operator import itemgetter
>>> second_item = itemgetter(1)
>>> my_list = [5, 2, 4, 9]
>>> sorted(enumerate(my_list), key=second_item)
[(1, 2), (2, 4), (0, 5), (3, 9)]
我想要一个列表,其中包含每个元素在排序后出现在列表中的位置。在上面的例子中,我想要这个结果:

>>> sorted(my_list)
[2, 4, 5, 9]

>>> magnitude(my_list)
[2, 0, 1, 3]
。。。因为排序后:

5在位置2结束 2结束于位置0 4在位置1结束 9在位置3结束
我如何才能做到这一点?

我们可以通过对序列的枚举进行排序来实现解决方案的一半,例如:

my_list = [5, 2, 4, 9]
In [8]: L = [5,2,4,9]

In [9]: LL = sorted(L)

In [10]: LL
Out[10]: [2, 4, 5, 9]

In [11]: sorted(enumerate(LL), key=lambda t: L.index(t[1]))
Out[11]: [(2, 5), (0, 2), (1, 4), (3, 9)]

In [12]: [s[0] for s in sorted(enumerate(LL), key=lambda t: L.index(t[1]))]
Out[12]: [2, 0, 1, 3]
>>> from operator import itemgetter
>>> second_item = itemgetter(1)
>>> my_list = [5, 2, 4, 9]
>>> sorted(enumerate(my_list), key=second_item)
[(1, 2), (2, 4), (0, 5), (3, 9)]
如您所见,结果列表中的每一对都具有原始位置、排序项的形式。。。例如,5最初位于位置0

我们可以编写一个只返回原始位置的函数:

def order(s):
    return [t[0] for t in sorted(enumerate(s), key=second_item)]
让我们确保它工作正常:

>>> order(my_list)
[1, 2, 0, 3]
聪明的一点是,现在我们根据自己的结果再次运行相同的函数:

>>> order([1, 2, 0, 3])
[2, 0, 1, 3]
为了了解这里发生了什么,让我们回头看看order到底在做什么:

>>> sorted(enumerate([1, 2, 0, 3]), key=second_item)
[(2, 0), (0, 1), (1, 2), (3, 3)]
同样,每一对都有原始位置的形式,排序的项目,因此我们有效地将位置重新排序到它们的原始顺序,并查看它们最终的位置

我们现在需要做的就是将顺序的双重用法包装到它自己的函数中,我们完成了:

from operator import itemgetter

second_item = itemgetter(1)

def order(s):
    return [t[0] for t in sorted(enumerate(s), key=second_item)]

def magnitude(s):
    return order(order(s))
。。。这就是行动:

>>> magnitude([5, 2, 4, 9])
[2, 0, 1, 3]

不清楚你在问什么。你能解释一下为什么这是给定输入的预期输出吗?