首页 > 解决方案 > 如何根据另一个列表的结果重新排序列表?

问题描述

我有一个列表,根据它们的大小分类成簇或组。

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 0in 55, cluster 1in 769, 774, 781, cluster 2in813, 832cluster 3它们在原始集群列表中的方式不同。

标签: pythondictionarycluster-analysis

解决方案


首先请注意,请不要像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]

推荐阅读