尝试更新值是列表的字典中的值时出错

时间:2019-04-29 21:34:36

标签: python python-3.7

在没有任何外部软件包(例如numpy和scipy)的情况下从头开始用python写kmeans,当我试图将数据点分配给集群时遇到了这个问题。

基本上,对于每个数据点,我都会找到最接近该点的聚类,然后通过将数据点添加到属于该聚类的点列表(即字典的值)来更新聚类字典。我的问题是,当我尝试更新字典中的键时,会将所有其他字典值都设置为None,这是不正确的。

试图将过程的各个步骤分开并逐行查看,但是当我尝试更新一个值时,所有其他值都变为None。

clusters = dict.fromkeys(k_init, [].copy())
    for elem in data:
        minC = (101010101, 9999999)
        for cent in k_init:
            #print(elem, cent)
            if eucliean(elem, cent) < minC[1]:
                minC = (cent, eucliean(elem, cent))
        key = minC[0]
        old = clusters.get(key)
        clusters[key] = old.append(elem)

1 个答案:

答案 0 :(得分:0)

问题就在线上

clusters = dict.fromkeys(k_init, [].copy())

当您创建如上所述的字典时,每个键都被分配了相同列表的引用。因此,每当您添加到任何键的列表时,所有其他键的引用都是相同的,因此您会看到它被附加到所有键上。为避免此问题,请执行以下操作:

clusters = { key : list([]) for key in keys }