如何根据另一个列表的结果重新排序列表?

How to reorder a list based on the results of another list?

我有一个列表,该列表根据大小分类为簇或组。

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 055 放入 cluster 1769, 774, 781 放入 [= cluster 3 中的 17=]、813, 832 与原始集群列表中的不同。

使用字典进行此类映射更容易操作。这是一个未优化的实现:

my_list = [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]

cluster_dict = {}
for c, e in zip(clusters, my_list):
    cluster_dict[c] = sorted(cluster_dict.get(c, []) + [e])

print(f"{cluster_dict=}")

# Renumbering clusters
new_clusters = [i for i, (k, v) in enumerate(cluster_dict.items()) for _ in v ]
new_list = [j for i, (k, v) in enumerate(cluster_dict.items()) for j in v ]

print(f"{new_clusters=}")
print(f"{new_list=}")

这应该打印:

cluster_dict={0: [4, 5, 8, 9, 11, 11, 12, 22], 3: [55], 1: [813, 832], 2: [769, 774, 781]}
new_clusters=[0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 3, 3]
new_list=[4, 5, 8, 9, 11, 11, 12, 22, 55, 813, 832, 769, 774, 781]

首先请注意,请不要将 python 默认关键字(如 list 覆盖到对象。另外,不确定为什么要在此处标记 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]