chain с combinations и permutations

chain с combinations и permutations

@python_quiz

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

Коротко: у нас есть цепочка итераторов — сначала все комбинации из четырёх букв по два, затем все перестановки двух букв. Вопрос — какие именно кортежи выведет код.

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

python

Пошаговый разбор

  1. combinations('ABCD', 2) генерирует все безупороченные комбинации по 2 в лексикографическом порядке:

- ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')

  1. permutations('XY', 2) даёт все упорядоченные перестановки длины 2:

- ('X', 'Y'), ('Y', 'X')

  1. chain объединяет эти генераторы последовательно: сначала все комбинации, потом перестановки.
  2. next(ch) извлекает первый элемент цепочки — это первый элемент первых комбинаций: ('A', 'B').
  3. list(ch) создаёт список из оставшихся элементов цепочки (все элементы после того, что уже извлечено next). Последний элемент этого списка — последний элемент всей цепочки, то есть последняя перестановка: ('Y', 'X').

Ожидаемый вывод при запуске

python

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

  • "('A', 'B') и ('X', 'Y')"

Причина несоответствия: хотя первый элемент совпадает, последний — не ('X', 'Y'), а следующая перестановка ('Y', 'X').

  • "('A', 'B') и ('Y', 'X')"

Совпадает с выводом программы: первый элемент — первый результат combinations, последний — последний результат permutations после обхода остатка цепочки.

  • "('B', 'C') и ('X', 'Y')"

Первый элемент не совпадает: next возвращает первый элемент комбинаций ('A','B'), а не ('B','C').

  • "('B', 'C') и ('Y', 'X')"

Первый элемент снова неверен по той же причине.

Практическая заметка по эффективности

list(ch)[-1] создаёт весь оставшийся список в памяти. Если в реальной задаче последовательность большая и вас интересует только последний элемент, можно экономно пройтись по итератору в одну переменную или использовать deque:

Вариант через простой цикл (память O(1)):

python

Вариант через deque (удобно и лаконично):

python

Вывод

Ключевые моменты: chain последовательно соединяет итераторы, next снимает только первый элемент, а list(ch) или проход по ch продолжают с того места, где остановились. В результате первый вывод — первая комбинация ('A', 'B'), а последний — последняя перестановка ('Y', 'X').

Report Page