python - Python:如何跟踪列表的排序方式?
问题描述
l0
给定一个可能包含重复的任意顺序的数字列表,如何l_s
在跟踪排序方式的同时对其进行排序,以便以后可以复制原始数字()? l0
l0_order
l_in_l0_order
重点是应用于另一个列表,l0_order
以便检索根据 排序的列表。l
l_s
l_in_l0_order
l0
到目前为止我使用的是
l0 = [1, 7, 3, 12, 12, 4]
ls = sorted(l0)
# ls
# [1, 3, 4, 7, 12, 12]
l0_order = [ls.index(v) for v in l0]
l_in_l0_order = [ls[i] for i in l0_order]
# l_in_l0_order
# [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
做同样的事情。
要反转排列,您可以在 上重复相同的过程order
:
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]
推荐阅读
- postgresql - Sqlalchemy 核心:重新格式化 select 内部的 select 查询
- javascript - 如何在单页应用程序中使用 Google adsense 广告?
- django - 根据帐户类型限制对 Django 中视图的访问
- javascript - 在里面打印对象值
- hyperledger-fabric - 为什么 Hyperledger Fabric 中没有 Merkle 树来跟踪世界状态
- android - Android 导航组件 - 在整个应用生命周期中存储/访问数据
- java - 我想知道如何创建一个包含多个包的 jar 文件
- mysql - 如何为laravel中的管理员进行自定义登录?
- python - AttributeError:无法获取属性“InsertNews”
我正在尝试编写一个程序来抓取网站内容。该脚本似乎运行了一段时间,但在几次迭代后停止
Traceback (most recent call last): File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\mult
- python - 如何发布位于包含 git lfs 文件的 git 存储库中的 Python 包?