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
,但请留下评论,说明为什么要留出改进空间。否则,这是没有帮助的。非常感谢。