У меня есть список значений, и я хочу поместить их в словарь, который отобразил бы каждое значение на, он - индекс.
Я могу сделать это этот путь:
>>> t = (5,6,7)
>>> d = dict(zip(t, range(len(t))))
>>> d
{5: 0, 6: 1, 7: 2}
это не плохо, но я ищу что-то более изящное.
Я столкнулся со следующим, но это делает противоположность того, в чем я нуждаюсь:
>>> d = dict(enumerate(t))
>>> d
{0: 5, 1: 6, 2: 7}
Совместно используйте свои решения,
Спасибо
Править: Python 2.6.4
Для списков, содержащих 1 000 элементов dict (zip), версия является самой быстрой, генератор и версии понимания списка фактически идентичны, и они в ~1.5 раза медленнее, и функциональная (инвертированная) карта значительно медленнее.
Python $-mtimeit-s "t = диапазон (интервал (1e3))" "d = dict (zip (t, диапазон (len (t))))"
1 000 циклов, лучших из 3: 277 мкс за цикл
Python $-mtimeit-s "t = диапазон (интервал (1e3))" "d = dict ([(y, x) для x, y в перечисляют (t)])"
1 000 циклов, лучших из 3: 426 мкс за цикл
Python $-mtimeit-s "t = диапазон (интервал (1e3))" "d = dict ((y, x) для x, y в перечисляют (t))"
1 000 циклов, лучших из 3: 437 мкс за цикл
Python $-mtimeit-s "t = диапазон (интервал (1e3))" "d = dict (карта (инвертированный, перечислите (t)))"
100 циклов, лучших из 3: 3,66 мс на цикл
Я пытался запустить те же тесты для дольше и для более коротких списков (1e2, 1e4, 1e5), и время на цикл масштабируется линейно с длиной списка.
Мог кто-то время py 2.7 + версия?
Вы можете использовать понимание списка (или генератор, в зависимости от вашей версии Python), чтобы выполнить простую замену на месте для вашего второго примера.
Использование понимания списка:
d = dict([(y,x) for x,y in enumerate(t)])
Использование выражения генератора (Python 2.4 и выше):
d = dict((y,x) for x,y in enumerate(t))
В Python2.7 + вы можете написать это так
>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
Как все уже написали, в Python 2.6 я бы счел наиболее питоничным следующее:
>>> dict((x, i) for i, x in enumerate(t))
{5: 0, 6: 1, 7: 2}
Тем не менее, в момент функционального безумия я бы написал:
>>> dict(map(reversed, enumerate(t)))
{5: 0, 6: 1, 7: 2}
>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>
Все ли ваши элементы уникальны (т.е. ваш список никогда не будет 5,6,7,7)? Решение с диктами будет работать только в том случае, если все ваши элементы уникальны.
Храня индекс, вы, по сути, дублируете информацию, поскольку вы можете просто запросить текущий индекс элемента в списке. Дублирование информации обычно не самая лучшая идея, поскольку это дает возможность одному набору данных рассинхронизироваться с другим.
Если список изменяется, ничто не мешает вам случайно присвоить один и тот же индекс нескольким элементам.
Зачем вы пытаетесь сохранить значение индекса, если можно просто получить индекс из списка?