如何根据另一个列表的结果重新排序列表?
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 0
、55
放入 cluster 1
、769, 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]
我有一个列表,该列表根据大小分类为簇或组。
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
、55
放入 cluster 1
、769, 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]