Пожаловаться

Упрощение Python кода с помощью знакомых инструментов

7940
Пожаловаться

В этой статье мы рассмотрим один из приёмов упрощения Python кода с помощью известного вам инструмента – функции enumerate().

Python кодаБольшинство людей, выучив что-то новое, добавляют знания в свою “копилку полезной информации”. Зачастую они на 100% уверены, что эта информация точно пригодится, но после никак не могут найти ей практическое применение.

Нередко программисты, начинающие изучать Python, сталкиваются с проблемой, когда необходимо реализовать словарь, в котором значение сопоставляется с индексом: {'Bob' : 0} и т. п.

Чтобы внести немного ясности, вот что нужно сделать:

input = ['Duration', 'F0', 'F1', 'F2', 'F3']
output = {'Duration': 0, 'F0': 1, 'F1': 2, 'F2': 3, 'F3': 4}

Целью создания является словарь, который сопоставит каждый элемент во входном списке с индексом элемента в этом самом списке. Такой словарь может быть применен для поиска индексов с использованием элементов в качестве ключей.

Вот как выглядит обычная реализация:

>>> {f:i for f, i in zip(input, range(len(input)))}
{'Duration': 0, 'F0': 1, 'F1': 2, 'F2': 3, 'F3': 4}

Код неплохой, однако можем ли мы сделать его лучше?

Упрощения Python кода с помощью enumerate(): реализация

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

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

>>> dict(zip(input, range(len(input))))
{'Duration': 0, 'F0': 1, 'F1': 2, 'F2': 3, 'F3': 4}

Уже лучше, но range(len(...)) всё ещё выбивается из общей картины. Давайте попробуем поиграть с enumerate():

>>> list(enumerate(input))
[(0, 'Duration'), (1, 'F0'), (2, 'F1'), (3, 'F2'), (4, 'F3')]

Итак, мы можем использовать enumerate() вкупе с индексом в списке. Давайте попробуем превратить это в словарь:

>>> dict(enumerate(input))
{0: 'Duration', 1: 'F0', 2: 'F1', 3: 'F2', 4: 'F3'}

В целом, это именно то, к чему мы и стремились, но "в обратном порядке”. Вместо сопоставления ключа к индексу, мы сопоставляем индекс к ключу. Как мы можем это изменить?

>>> {f: i for i, f in enumerate(input)}
{'Duration': 0, 'F0': 1, 'F1': 2, 'F2': 3, 'F3': 4}

Отлично, мы добились своего!

Заключение

Как можно заметить, действительно существует способ, который смог бы “почистить” код с помощью enumerate().

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

Оригинал

Статьи по теме:

7940

Комментарии

Рекомендуем

BUG!