Упрощение Python кода с помощью знакомых инструментов
В этой статье мы рассмотрим один из приёмов упрощения Python кода с помощью известного вам инструмента – функции enumerate()
.
Большинство людей, выучив что-то новое, добавляют знания в свою “копилку полезной информации”. Зачастую они на 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 кода.