Как применить `enumerate()` с условием и отфильтровать элементы с определенным индексом?

Для фильтрации элементов `enumerate()` с условием, можно использовать генератор списков (list comprehension) или генераторное выражение (generator expression) вместе с условным оператором `if`.

Пример (генератор списка):

  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() с условием и фильтрацией элементов с определенным индексом можно решить несколькими способами, в зависимости от необходимой гибкости и читаемости кода. Вот несколько подходов с пояснениями и примерами:

1. Использование генератора списков/выражений-генераторов с `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 ...]: Создает новый список, содержащий только значения отфильтрованных элементов.

2. Использование цикла `for` с `enumerate()` и условным оператором:

Этот подход более многословен, но может быть более читаемым, особенно если логика фильтрации сложная.


  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.

3. Использование `filter()` и `enumerate()` (менее распространенный):

Этот подход менее читаемый и менее эффективный, чем генераторы списков, и обычно не рекомендуется. Он демонстрирует альтернативный способ, но его следует избегать в большинстве случаев.


  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) не рекомендуется, так как оно менее эффективно и труднее для понимания.

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

0