我有一个列表,根据它们的大小分类为集群或组。
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 2
,813, 832
cluster 3
,这与它们在原始集群列表中的方式不同。
首先注意,请不要覆盖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]
对此类映射使用字典更容易操作。下面是一个未优化的实现:
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]