python - 如何根据另一个列表的结果重新排序列表?
问题描述
我有一个列表,根据它们的大小分类成簇或组。
l = [4, 55, 8, 9, 12, 11, 11, 813, 832, 774, 781, 5, 769, 22]
clusters = [0, 3, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 2, 0]
但是,排序是错误的。无法修改包的基本功能,所以我想重新排序集群,以便按升序对它们重新编号。
这是我想要的结果:
l = [4, 55, 8, 9, 12, 11, 11, 813, 832, 774, 781, 5, 769, 22]
clusters = [0, 1, 0, 0, 0, 0, 0, 3, 3, 2, 2, 0, 2, 0]
如您所见,列表中的项目与唯一集群的关联方式不应更改 - 只是与集群关联的数字应根据列表中的项目按升序重新排序。有没有办法我可以做到这一点?
编辑:为了澄清,我试图订购并放入4, 5, 8, 11, 11, 12, 22
, cluster 0
in 55
, cluster 1
in 769, 774, 781
, cluster 2
in813, 832
与cluster 3
它们在原始集群列表中的方式不同。
解决方案
首先请注意,请不要像list
对象一样覆盖 python 默认关键字。另外,不知道你为什么在这里标记 numpy。我假设您的对象是列表。这是实现精确输出的简单解决方案:
l = [4, 55, 8, 9, 12, 11, 11, 813, 832, 774, 781, 5, 769, 22]
clusters = [0, 3, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 2, 0]
#make a dict from clusters to list
x = dict(zip(clusters,l))
#{0: 22, 3: 55, 1: 832, 2: 769}
#sort them by values
y = dict(sorted(x.items(),key=lambda item:item[1]))
#{0: 22, 3: 55, 2: 769, 1: 832}
#remap clusters
clusters = list(map(dict(zip(y,range(len(y)))).get, clusters))
#[0, 1, 0, 0, 0, 0, 0, 3, 3, 2, 2, 0, 2, 0]
推荐阅读
- c# - 我不知道我的 lambda 表达式做错了什么,有人可以纠正我吗?
- python - 在 python 中,如何反转二维字典?
- javascript - Node.js 6.10 十六进制->BASE64->UTF8
- unit-testing - 单元测试失败 (JUnit+Mockito) - 空指针异常
- android - 如何在 android studio 的 facebook 上分享任何文字?
- c# - C# 同一个 DLL 的多个版本
- reactjs - “网络错误:尝试获取资源时出现 NetworkError。”
- objective-c - 如何以编程方式禁用安全输入?
- django - 未找到带有关键字参数“{'order_id': 'JUQEDJA6QQ'}”的“order_detail”的反向操作。尝试了 1 种模式:
- kubernetes - Kubernetes pod 因 CrashLoopBackOff 而崩溃