Get: TypeError: объект' dict values ' не поддерживает индексирование при использовании python 3.2.3 [дубликат]



этот вопрос уже есть ответ здесь:



Это мой код:



{names[i]:d.values()[i] for i in range(len(names))}


это работает полностью нормально при использовании python 2.7.3; однако, когда я использую python 3.2.3, я получаю сообщение об ошибке'dict_values' object does not support indexing. Как я могу изменить код, чтобы сделать его совместимым для 3.2.3?

654   3  

3 ответов:

В Python 3, dict.values() (вместе с dict.keys() и dict.items()) возвращает a view, а не список. Смотрите документацию здесь. Поэтому вам нужно обернуть свой вызов на dict.values() позвонил list вот так:

v = list(d.values())
{names[i]:v[i] for i in range(len(names))}

более простая версия вашего кода будет:

dict(zip(names, d.values()))

если вы хотите сохранить ту же структуру, вы можете изменить его на:

vlst = list(d.values())
{names[i]: vlst[i] for i in range(len(names))}

(вы можете так же легко поставить list(d.values()) внутри понимания вместо vlst, это просто расточительно, поскольку это будет повторно генерировать список каждый раз).

в Python 3 в dict.values() метод возвращает a посмотреть в словарь объекта, а не список, как это делает в Python 2. Представления словаря имеют длину, могут быть повторены и поддерживают тестирование членства, но не поддерживают индексирование.

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

{names[i]:value for i,value in enumerate(d.values())}

или

values = list(d.values())
{name:values[i] for i,name in enumerate(names)}

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

dict(zip(names, d.values()))

обратите внимание, однако, что все эти методы дадут вам результаты, которые будут варьироваться в зависимости от фактического содержания d. Чтобы преодолеть это, вы можете использовать OrderedDict вместо этого, который помнит того, что ключи были вставлены в него, поэтому вы можете рассчитывать на того, что вернулся к values() метод.

Comments

    Ничего не найдено.