Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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_List_Sorting - Fatal编程技术网

Python:如何跟踪列表的排序方式?

Python:如何跟踪列表的排序方式?,python,list,sorting,Python,List,Sorting,给定一个以任意顺序排列的可能包含重复项的数字列表,如何将其排序为l_s,同时跟踪如何排序l0,以便以后可以复制原始的l0_顺序(l_顺序) 要点是将l0_顺序应用于另一个l列表,该列表处于l_顺序,以检索根据l0顺序排列的列表 到目前为止,我使用的是 l0=[1,7,3,12,12,4] ls=已排序(l0) #ls # [1, 3, 4, 7, 12, 12] l0_顺序=[l0中v的ls.索引(v)] l_in_l0_顺序=[ls[i]代表i in l0_顺序] #按顺序排列 # [1, 7

给定一个以任意顺序排列的可能包含重复项的数字列表,如何将其排序为
l_s
,同时跟踪如何排序
l0
,以便以后可以复制原始的
l0_顺序(
l_顺序

要点是将
l0_顺序
应用于另一个
l
列表,该列表处于
l_
顺序,以检索根据
l0
顺序排列的列表

到目前为止,我使用的是

l0=[1,7,3,12,12,4]
ls=已排序(l0)
#ls
# [1, 3, 4, 7, 12, 12]
l0_顺序=[l0中v的ls.索引(v)]
l_in_l0_顺序=[ls[i]代表i in l0_顺序]
#按顺序排列
# [1, 7, 3, 12, 12, 4]
  • 有没有更聪明的方法?对于大型列表,这会大量调用
    index

注意:对于具有相同值但不同
id
的元素的列表,上述方法可能会产生无效结果,因为
index
(afaik)比较的是值,而不是id。我不要求这种行为(id的顺序),但它可能与一般解决方案相关。

如果
l0
中的项相等但不相同,则系统将失败。此外,在每个成员上使用
.index
是不必要的膨胀,O(N^2)。在这种情况下,您希望对键进行排序,然后查找元素,而不是像您那样对元素进行排序并查找键。一方面,通过键查找元素很快;另一方面,您获取的元素没有歧义

order = sorted(list(range(len(l0))), key=lambda i: l0[i])
l1 = [l0[i] for i in order]
正如在评论中所说,
numpy.argsort
做同样的事情

要反转排列,您可以在
顺序上重复相同的过程:

inverse_order = sorted(order, key=lambda i: order[i])
l0_again = [l1[i] for i in inverse_order]
显然,您可以使用相同的过程将另一个按
l1
顺序排列的列表重新排列为
l0
顺序:

ls_in_l0_order = [ls[i] for i in inverse_order]

numpy不是一个选项吗?如果性能有问题,您可以使用
argsort
,但请留下评论,说明为什么要留出改进空间。否则,这是没有帮助的。非常感谢。