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?
3 ответов:
В Python 3,
dict.values()(вместе сdict.keys()иdict.items()) возвращает aview, а не список. Смотрите документацию здесь. Поэтому вам нужно обернуть свой вызов на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