2016-11-28 2 views
1

Ниже приведен мой код: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 

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

+0

Похоже, вы пытаетесь запустить (ужасно неэффективный) Python 2 кода на Python 3. – user2357112

+0

Если вы должны искать через значения, чтобы получить ключи, представляющие интерес, это может быть признаком того, что ваш ДИКТ неправильно введен ключ. – wim

ответ

2

В 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] 

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

+0

Нет, вы добавляете значения. Он добавляет ключи. – wim

+0

@wim - спасибо, я пропустил это. К счастью, это легко исправить :-) – mgilson

1

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

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

Смежные вопросы