У меня есть тег строки списка.
Я пытаюсь инициализировать словарь с ключом в качестве строки тега и значениями в качестве индекса массива.
for i, ithTag in enumerate(tag):
tagDict.update(ithTag=i)
Вышеупомянутое возвращает мне {'ithTag': 608} 608 - это 608-й индекс
Моя проблема в том, что пока i интерпретируется как переменная, Python обрабатывает «ithTag» как строку, а не как переменную.
Я в замешательстве, довольно сложно гуглить такие конкретные вопросы. Надеюсь, я правильно сформулировал заголовок этого вопроса,
Спасибо!
Я выбрал его, потому что первым ответил Джеруб; и я сразу отметила это. Также из опыта работы с C# / Java ответ Джеруба кажется мне более знакомым, и мне понравилось его объяснение, почему .update () не сработал для меня.






Вы действительно хотите это сделать:
for i, tag in enumerate(tag):
tagDict[tag] = i
Метод .update () используется для обновления словаря с использованием другого словаря, а не для изменения одной пары ключ / значение.
Я думаю, это то, что вы хотите сделать:
d = {}
for i, tag in enumerate(ithTag):
d[tag] = i
Пытаться
tagDict[ithTag] = i
Если хочешь быть умным:
tagDict.update(map(reversed, enumerate(tag)))
Спасибо Брайану за обновление. Очевидно, это примерно на 5% быстрее, чем итерационная версия.
(Обновлено: Спасибо, saverio за указание, что мой ответ был неправильным (теперь исправлен). Вероятно, наиболее эффективным / питоническим способом был бы ответ Торстена Марека, слегка измененный:
tagDict.update((t, i) for (i,t) in enumerate(tag))
)
На самом деле update () может принимать последовательность напрямую, поэтому создавать промежуточный dict нет необходимости. Выполнение tagDict.update (enumerate (tag)) на самом деле немного (~ 5%) быстрее, чем итеративная версия.
Клавиши tagDict должны быть элементами tag. Используйте tagDict.update(map(reversed, enumerate(tag))), фактически функциональный эквивалент ответа Торстена Марека.
@Claudiu, потому что, как уже упоминалось saverio, tagDict.update(enumerate(tag)) делает индексы как ключи dict, в то время как они должны быть значениями
Это однострочный:
tagDict = dict((t, i) for i, t in enumerate(tag))
Я думаю, что это должен быть принятый ответ - здесь более ясно, что происходит, нет побочных эффектов, о которых нужно беспокоиться.
Я думаю, что вам нужно следующее:
for i, ithTag in enumerate(tag):
tagDict.update({ithTag: i})
Это вопрос, почти вызывающий одобрение. Думаю, хуже Вот этот только выбранный ответ. Не хотите изменить или объяснить причины выбора ответа цикла for?