points=[0.0,2.0,3.0,10.0]
def hierarchy(linkage):
    clusters=[(i,) for i in range(len(points))]
    merges=[]
    while len(clusters)>1:
        candidates=[]
        for i in range(len(clusters)):
            for j in range(i+1,len(clusters)):
                ds=[abs(points[a]-points[b]) for a in clusters[i] for b in clusters[j]]
                d=min(ds) if linkage=='single' else max(ds)
                candidates.append((d,clusters[i],clusters[j],i,j))
        d,ca,cb,i,j=min(candidates)
        combined=tuple(sorted(ca+cb))
        merges.append((ca,cb,d))
        clusters=[c for k,c in enumerate(clusters) if k not in (i,j)]+[combined]
        clusters.sort()
    return merges
single=hierarchy('single')
complete=hierarchy('complete')
print('single',single)
print('complete',complete)
assert [d for _,_,d in single]==[1.0,2.0,7.0]
assert [d for _,_,d in complete]==[1.0,3.0,10.0]
