python list列表根据元素间的距离关系,分成指定的几组。

请问下,一个list是这样的

  a_list=[220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]。

我想要类似于聚类的方式,将这一个列表,根据他们间的距离,分成三份,该如何做啊?

最后变成这一样子:


[[219, 219.9, 220, 221, 221.6], [300.3, 310], [399, 400, 401]]   

就满意了。谢谢


def cluster(data, maxgap):
    data.sort()
    groups = [[data[0]]]
    for x in data[1:]:
        if abs(x - groups[-1][-1]) <= maxgap:
            groups[-1].append(x)
        else:
            groups.append([x])
    return groups


if __name__ == '__main__':
    data = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
    maxgap = 15
    print(cluster(data, maxgap))

a_list = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
a_list.sort()
b=[]
while len(a_list)>0:
    k = a_list[0]
    c=[x for  x in a_list if x<k+80]
    b.append(c)
    for i in c:
        a_list.remove(i)
print(b)

运行结果

img

聚类的话 用KMEANS算法啊 这个的学,不然写了你也看不懂


import numpy as np

def cluster_oneDimensional(a, center_num):
    center_dist_min = 30
    center = np.asarray(list(set(a)))[:center_num]
    while True:
        centero = center
        # cls = [[a[0]], [a[1]], [a[2]]]
        cls = [[a[i]] for i in range(center_num)]
        # cls = center.reshape((-1, 1)).tolist()
        for ai in a:
            dist = np.abs(center-ai)
            for c in cls:
                if ai in c:
                    c.remove(ai)
            cls[dist.argmin()].append(ai)
        center = np.asarray([sum(i)/len(i) for i in cls])
        center_dist = center[1:]-center[:-1]
        for idx,cd in enumerate(center_dist):
            if cd<center_dist_min:
                center[idx:] += center_dist_min
        if np.all(center==centero):
            # print(cls)
            # print(center)
            # break
            return cls

x_center_list = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
a = np.asarray(x_center_list)

cluster_list = cluster_oneDimensional(a, center_num=3)
print(cluster_list)

输出结果:
[[300.3, 310.0], [220.0, 221.0, 221.6, 219.0, 219.9], [399.0, 400.0, 401.0]]