Объект Dict_values ​​не поддерживает индексацию

Вот мой код:

word_centroid_map =dict(zip(model.index2word, idx ))
for cluster in range(0,10):

# Print the cluster number  
print ("\nCluster %d" % cluster)

# Find all of the words for that cluster number, and print them out
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)

Я использую Python 3, и я получаю сообщение об ошибке:

TypeError: 'dict_values' object does not support indexing

Может кто-нибудь, пожалуйста, помогите? Заранее спасибо.

3 ответа

В python3.x, dict.values() больше не возвращает список - он возвращает dict_values объект. Вы не можете подписывать экземпляры dict_values. например

dict_values = some_dict.values()
dict_values[any_value]  # TypeError!

В этом случае, похоже, исправление должно заключаться в том, чтобы прекратить использование индексов и просто выполнять итерацию непосредственно над элементами словаря:

words = []
for key, item in word_centroid_map.items():
    if item == cluster:
        words.append(key)
print (words)

Или, как список-понимание:

words = [k for k, w in word_centroid_map.items() if w == cluster]

Также обратите внимание, что это должно быть намного эффективнее, чем соответствующий код python2.x (в котором вы неоднократно генерируете списки, чтобы просто отбрасывать их и заново генерировать при следующем повороте цикла).

В качестве дополнения / уточнения к мгильсону отвечу:

Объекты, возвращаемые dict.keys (), dict.values ​​() и dict.items (), являются объектами представления. Они обеспечивают динамическое представление записей словаря, что означает, что при изменении словаря представление отражает эти изменения. ( https://docs.python.org/3/library/stdtypes.html)

Вы также можете использовать преобразование объектов dict_values, dict_keys в список, используя list():

      list( word_centroid_map.keys() )[i] 
Другие вопросы по тегам