pythonic способ связать элементы списка с их индексами

У меня есть список значений, и я хочу поместить их в словарь, который отобразил бы каждое значение на, он - индекс.

Я могу сделать это этот путь:

>>> 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 + версия?

9
задан Dragan Chupacabric 14 May 2010 в 17:14
поделиться

6 ответов

Вы можете использовать понимание списка (или генератор, в зависимости от вашей версии Python), чтобы выполнить простую замену на месте для вашего второго примера.


Использование понимания списка:

d = dict([(y,x) for x,y in enumerate(t)])

Использование выражения генератора (Python 2.4 и выше):

d = dict((y,x) for x,y in enumerate(t))
14
ответ дан 4 December 2019 в 06:40
поделиться

В Python2.7 + вы можете написать это так

>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
13
ответ дан 4 December 2019 в 06:40
поделиться

Как все уже написали, в 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}
2
ответ дан 4 December 2019 в 06:40
поделиться
>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>
4
ответ дан 4 December 2019 в 06:40
поделиться

Все ли ваши элементы уникальны (т.е. ваш список никогда не будет 5,6,7,7)? Решение с диктами будет работать только в том случае, если все ваши элементы уникальны.

Храня индекс, вы, по сути, дублируете информацию, поскольку вы можете просто запросить текущий индекс элемента в списке. Дублирование информации обычно не самая лучшая идея, поскольку это дает возможность одному набору данных рассинхронизироваться с другим.

Если список изменяется, ничто не мешает вам случайно присвоить один и тот же индекс нескольким элементам.

Зачем вы пытаетесь сохранить значение индекса, если можно просто получить индекс из списка?

2
ответ дан 4 December 2019 в 06:40
поделиться

Мне нравится dict(zip(t, range(len(t)))) best.

0
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: