data = ['a', 'b', 'c', 'd', 'e']
filtered_data = [value for index, value in enumerate(data) if index % 2 == 0] # Фильтрация по четным индексам
print(filtered_data) # Вывод: ['a', 'c', 'e']
Здесь, `enumerate(data)` возвращает кортежи `(index, value)`, и `if index % 2 == 0` фильтрует элементы только с четными индексами. Генератор списка создаёт новый список `filtered_data` содержащий только отфильтрованные значения. Аналогично, можно использовать любое другое условие фильтрации, основанное на индексе или значении элемента.
Вопрос о применении enumerate()
с условием и фильтрацией элементов с определенным индексом можно решить несколькими способами, в зависимости от необходимой гибкости и читаемости кода. Вот несколько подходов с пояснениями и примерами:
Это, пожалуй, самый распространенный и идиоматичный способ. Он сочетает в себе enumerate()
для получения индекса и значения элемента, а затем использует условный оператор if
внутри генератора для фильтрации.
data = ['apple', 'banana', 'cherry', 'date', 'fig']
# Пример: Получить только элементы с четными индексами, значения которых начинаются с буквы 'b'
result = [value for index, value in enumerate(data) if index % 2 == 0 and value.startswith('b')]
print(result) # Output: [] (т.к. только 'banana' начинается с 'b', но его индекс 1 нечетный)
# Пример: Получить значения элементов с индексами больше 1, которые содержат букву 'a'
result = [value for index, value in enumerate(data) if index > 1 and 'a' in value]
print(result) # Output: ['banana', 'date']
Пояснение:
enumerate(data)
: Создает итератор, возвращающий пары (index, value)
для каждого элемента в data
.for index, value in ...
: Перебирает пары индекс-значение.if index % 2 == 0 and value.startswith('b')
: Фильтрует элементы, оставляя только те, у которых индекс четный И значение начинается с 'b'.[value for ...]
: Создает новый список, содержащий только значения отфильтрованных элементов.Этот подход более многословен, но может быть более читаемым, особенно если логика фильтрации сложная.
data = ['apple', 'banana', 'cherry', 'date', 'fig']
result = []
for index, value in enumerate(data):
if index % 2 == 0 and value.startswith('a'):
result.append(value)
print(result) # Output: ['apple']
Пояснение:
for
перебирает пары индекс-значение, возвращаемые enumerate()
.if
-условие проверяет, соответствует ли текущий элемент заданному критерию.result
.Этот подход менее читаемый и менее эффективный, чем генераторы списков, и обычно не рекомендуется. Он демонстрирует альтернативный способ, но его следует избегать в большинстве случаев.
data = ['apple', 'banana', 'cherry', 'date', 'fig']
# Фильтруем только элементы, у которых индекс делится на 3 и значение содержит 'e'
result = list(map(lambda x: x[1], filter(lambda x: x[0] % 3 == 0 and 'e' in x[1], enumerate(data))))
print(result) # Output: ['apple', 'date']
Пояснение:
enumerate(data)
: Создает итератор пар индекс-значение.filter(lambda x: x[0] % 3 == 0 and 'e' in x[1], enumerate(data))
: Фильтрует элементы, оставляя только те, у которых индекс делится на 3 И значение содержит 'e'. lambda x: ...
создает анонимную функцию, которая принимает пару (индекс, значение) и возвращает True, если элемент должен быть включен в результат, и False в противном случае.map(lambda x: x[1], ...)
: Извлекает только значение из отфильтрованных пар (индекс, значение).list(...)
: Преобразует результат в список.
Генератор списков/выражение-генератор (вариант 1) обычно является наиболее предпочтительным, поскольку он обеспечивает лаконичный и читаемый код. Цикл for
(вариант 2) может быть более читаемым, если условие фильтрации сложное. Использование filter()
(вариант 3) не рекомендуется, так как оно менее эффективно и труднее для понимания.
Важно: На собеседовании стоит пояснить, что выбор подхода зависит от контекста задачи и требований к читаемости и производительности кода.