错误:'dict_values'对象不支持索引

Puk*_*rya 0 python python-3.x

我正在尝试使用Kaggle Bag of Words模块,并且在某一点上,它抛出了这个错误:

kmeans_clustering = KMeans( n_clusters = num_clusters )
idx = kmeans_clustering.fit_predict( word_vectors )
word_centroid_map = dict(zip( model.wv.index2word, idx ))
Run Code Online (Sandbox Code Playgroud)

现在,

for cluster in range(0,10):
        print("\nCluster %d" % cluster)
        words = []
        for i in range(0,len(word_centroid_map.values())):
            if( word_centroid_map.values()[i] == cluster ):
                words.append(word_centroid_map.keys()[i])
        print(words)
Run Code Online (Sandbox Code Playgroud)

错误是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-f230ff75f988> in <module>()
      3         words = []
      4         for i in range(0,len(word_centroid_map.values())):
----> 5             if( word_centroid_map.values()[i] == cluster ):
      6                 words.append(word_centroid_map.keys()[i])
      7         print(words)

TypeError: 'dict_values' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

Tur*_*urn 5

直接的答案是 dict 的values方法返回一个不可索引的对象,如错误所示。你可以通过传递到列表来解决这个问题:

list(word_centroid_map.values())
Run Code Online (Sandbox Code Playgroud)

但实际上你最好像这样重写你的循环:

for key, value word_centroid_map.items():
    if value == cluster:
        words.append(key)
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,使用列表理解:

words = [k for k, v in word_centroid_map.items() if v == cluster]
Run Code Online (Sandbox Code Playgroud)


Ore*_*shi 5

word_centroid_map.values() 返回一个无法索引的dict_values对象.

但是,list(word_centroid_map.values())如果要对其进行索引,可以通过执行转换来进行转换.

这是我的意思的一个非常简单的例子:

>>> d = {'a': [1,2,3,4], 'b':[5,6,7,8]}
>>> d.values()
dict_values([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> d.values()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_values' object does not support indexing
>>> list(d.values())[0]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)