zip + enumerate в Python: почему некоторые элементы пропадают

zip + enumerate в Python: почему некоторые элементы пропадают

@python_quiz

Разберем этот квиз

Коротко: у нас есть два списка разной длины, затем применяется zip и enumerate с начальным индексом 1. Разберём, что именно произойдёт и почему.

Условие (код)

python

Поведение zip

  • zip проходит по переданным итерируемым параллельно и останавливается, как только одна из последовательностей закончилась.
  • То есть zip "усекает" результат по самой короткой последовательности.

Пример:

python

Элемент 'c' не будет включён, потому что для него нет соответствующего значения в ids.

Поведение enumerate(start=1)

  • enumerate берёт итерируемый объект и возвращает пары (индекс, значение).
  • Аргумент start задаёт начальное значение счётчика; по умолчанию start=0, в нашем примере явно указан start=1.

Пример:

python

Общий вывод программы

Комбинируя поведение zip и enumerate получаем следующий вывод:

python

Анализ предложенных вариантов

  • Вариант с тройкой и None внутри предполагает, что zip заполняет недостающие значения значением None — это не так. Такое поведение было бы у itertools.zip_longest, а не у обычного zip.
  • Вариант с индексами, начинающимися с 0, неверен в этом контексте, потому что в коде явный параметр start=1.
  • Вариант, где каждый элемент — кортеж (индекс, ('буква', число)), совпадает с ожидаемым выводом программы.
  • Вариант с плоскими кортежами (индекс, 'a', 10) неверен: enumerate возвращает кортеж из двух элементов — индекс и значение (в данном случае значение само по себе кортеж).

Как получить поведение с заполнением отсутствующих значений

Если нужно, чтобы недостающие значения заполнялись, используйте itertools.zip_longest:

python

Можно указать fillvalue, например zip_longest(names, ids, fillvalue=0).

Вывод

zip обрезает результат по самой короткой последовательности, а enumerate нумерует полученные элементы начиная с указанного start. В комбинации это даёт список пар (индекс, (name, id)), где элементы из более длинной последовательности без пары отбрасываются — если только вы не используете zip_longest.

Report Page