Объект 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]