Вопрос-Ответ

What does enumerate() mean?

Что означает enumerate()?

Что for row_number, row in enumerate(cursor): делает в Python?

Что enumerate означает в этом контексте?

Переведено автоматически
Ответ 1

enumerate() Функция добавляет счетчик к итерируемому элементу.

Итак, для каждого элемента в cursor создается кортеж с помощью (counter, element); for цикл связывает это с row_number и row соответственно.

ДЕМОНСТРАЦИЯ:

>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
... print elem
...
foo
bar
baz
>>> for count, elem in enumerate(elements):
... print count, elem
...
0 foo
1 bar
2 baz

По умолчанию enumerate() отсчет начинается с 0, но если вы дадите ему второй целочисленный аргумент, он будет начинаться с этого числа:

>>> for count, elem in enumerate(elements, 42):
... print count, elem
...
42 foo
43 bar
44 baz

Если бы вам пришлось повторно реализовать enumerate() на Python, вот два способа добиться этого; один с использованием itertools.count() для подсчета, другой вручную в функции-генераторе:

from itertools import count

def enumerate(it, start=0):
# return an iterator that adds a counter to each element of it
return zip(count(start), it)

и

def enumerate(it, start=0):
count = start
for elem in it:
yield (count, elem)
count += 1

Фактическая реализация на C ближе к последнему, с оптимизациями для повторного использования одного объекта tuple для общего for i, ... случая распаковки и использованием стандартного целого значения C для счетчика, пока счетчик не станет слишком большим, чтобы избежать использования целого объекта Python (который неограничен).

Ответ 2

Это встроенная функция, которая возвращает объект, который можно повторять. Смотрите Документацию.

Короче говоря, он перебирает элементы итеративного объекта (например, списка), а также индексный номер, объединенные в кортеж:

for item in enumerate(["a", "b", "c"]):
print item

С принтами

(0, "a")
(1, "b")
(2, "c")

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

Ответ 3

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

list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
letter = list_of_letters[i]
print (i, letter)

Вывод таков:

0 a
1 b
2 c

Раньше я тоже делал кое-что, еще более глупое, прежде чем прочитал о enumerate функции.

i = 0
for n in list_of_letters:
print (i, n)
i += 1

Он выдает тот же результат.

Но с enumerate мне просто нужно написать:

list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
print (i, letter)
Ответ 4

Как упоминали другие пользователи, enumerate это генератор, который добавляет инкрементный индекс рядом с каждым элементом итерации.

Итак, если у вас есть список, скажем, l = ["test_1", "test_2", "test_3"], то list(enumerate(l)) выдаст вам что-то вроде этого: [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')].

Теперь, когда это полезно? Возможный вариант использования - это когда вы хотите выполнить итерацию по элементам и пропустить определенный элемент, о котором вам известен только его индекс в списке, но не его значение (потому что его значение на данный момент неизвестно).

for index, value in enumerate(joint_values):
if index == 3:
continue

# Do something with the other `value`

Итак, ваш код читается лучше, потому что вы также могли бы выполнить обычный цикл for с помощью range но затем для доступа к элементам вам нужно их проиндексировать (т. Е. joint_values[i]).

Хотя другой пользователь упомянул реализацию enumerate using zip , я думаю, что более чистый (но немного более сложный) способ без использования itertools заключается в следующем:

def enumerate(l, start=0):
return zip(range(start, len(l) + start), l)

Пример:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)

Вывод:


[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]


[(10, 'test_1'), (11, 'test_2'), (12, 'test_3')]


Как упоминалось в комментариях, этот подход с диапазоном не будет работать с произвольными итерациями, как это делает исходная enumerate функция.

2023-04-25 00:11 python