Перебор кортежей в Python
Все способы перебора кортежа в Python: циклы for и while, enumerate, range(len()), zip, вложенные кортежи и операторы управления циклом.
Перебор кортежа позволяет обращаться к каждому элементу по одному и выполнять нужные действия. Поскольку кортежи — неизменяемые последовательности, содержимое которых нельзя изменить, итерация по ним безопасна и проста. На этой странице рассмотрены все распространённые техники: циклы for, циклы while, enumerate(), range(len()), zip(), обход вложенных кортежей и управление циклом с помощью break/continue.
Если вы только знакомитесь с кортежами, сначала прочитайте Python Tuples. Общий синтаксис циклов описан в разделах Python For Loops и Python While Loops.
Использование цикла for
Самый простой и питонический способ перебрать кортеж — цикл for. Python последовательно проходит каждый элемент и присваивает его переменной цикла.
Перебор кортежа с помощью цикла for
Вывод:
1
2
3
4
5Цикл завершается автоматически, когда достигает последнего элемента — никакой арифметики с индексами не требуется.
Использование цикла while
Цикл while даёт полный контроль над индексом вручную. Он удобен, когда нужно продвигаться вперёд или назад более чем на один шаг, либо когда условие остановки зависит от чего-то иного, а не от длины кортежа.
Перебор кортежа с помощью цикла while
my_tuple = ('apple', 'banana', 'cherry')
i = 0
while i < len(my_tuple):
print(my_tuple[i])
i += 1Вывод:
apple
banana
cherryОбязательно увеличивайте i внутри тела цикла, иначе цикл будет выполняться бесконечно.
Получение индекса с помощью enumerate()
Когда нужны и позиция, и значение, используйте enumerate(). Эта функция дополняет каждый элемент его индексом (начиная с нуля) и возвращает оба значения вместе.
Перебор кортежа с использованием enumerate
colors = ('red', 'green', 'blue')
for index, color in enumerate(colors):
print(index, color)Вывод:
0 red
1 green
2 blueНумерацию можно начать с любого числа, передав второй аргумент:
Запуск enumerate с 1
colors = ('red', 'green', 'blue')
for index, color in enumerate(colors, start=1):
print(index, color)Вывод:
1 red
2 green
3 blueenumerate() предпочтительнее range(len()), когда нужны и индекс, и значение, поскольку код становится более читаемым и исключается лишний шаг индексации.
Получение индекса с помощью range(len())
Более старый, но по-прежнему рабочий подход — использовать range(len()) для получения допустимых индексов и затем обращаться к каждому элементу по позиции.
Перебор кортежа с использованием range и len
fruits = ('apple', 'banana', 'cherry')
for i in range(len(fruits)):
print(i, fruits[i])Вывод:
0 apple
1 banana
2 cherryЭтот подход удобен, когда нужно сравнивать соседние элементы или изменять производный список на основе позиции, поскольку индекс и значение доступны одновременно.
Итерация по вложенным кортежам
Кортеж может содержать другие кортежи. Для доступа к внутренним значениям используйте вложенный цикл for.
Итерация по вложенному кортежу (матрица)
matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
for row in matrix:
for value in row:
print(value, end=' ')
print()Вывод:
1 2 3
4 5 6
7 8 9 Каждая итерация внешнего цикла даёт один внутренний кортеж (row). Внутренний цикл затем проходит по этому кортежу элемент за элементом.
Если форма внутреннего кортежа фиксирована, можно распаковать его прямо в заголовке цикла:
Распаковка внутренних кортежей во время перебора
points = ((0, 0), (1, 2), (3, 4))
for x, y in points:
print(f'x={x}, y={y}')Вывод:
x=0, y=0
x=1, y=2
x=3, y=4Это делает код почти читаемым как обычный текст и позволяет избежать обращений вида row[0] / row[1]. Подробнее о распаковке читайте в разделе Unpack Tuples.
Параллельный перебор двух кортежей с помощью zip()
zip() объединяет элементы двух (или более) кортежей по позиции и позволяет распаковывать их в одном цикле.
Параллельный перебор двух кортежей
names = ('Alice', 'Bob', 'Carol')
scores = (95, 87, 92)
for name, score in zip(names, scores):
print(name, score)Вывод:
Alice 95
Bob 87
Carol 92zip() останавливается, как только заканчивается самый короткий кортеж, поэтому несовпадение длин не вызывает ошибку — лишние элементы просто отбрасываются. Если нужны все пары с заполнением пропусков, используйте itertools.zip_longest() из стандартной библиотеки.
Управление циклом: break и continue
Досрочная остановка с помощью break
break немедленно выходит из цикла при выполнении условия.
Досрочная остановка перебора кортежа с помощью break
numbers = (1, 2, 3, 4, 5, 6)
for n in numbers:
if n == 4:
break
print(n)Вывод:
1
2
3Цикл печатает 1, 2, 3, а затем останавливается, встретив 4.
Пропуск элементов с помощью continue
continue переходит к следующей итерации, не выполняя оставшийся код в теле цикла.
Пропуск чётных чисел с помощью continue
numbers = (1, 2, 3, 4, 5, 6)
for n in numbers:
if n % 2 == 0:
continue
print(n)Вывод:
1
3
5Печатаются только нечётные числа; чётные числа молча пропускаются.
Формирование списка из перебора кортежа
Поскольку кортежи неизменяемы, их нельзя изменять на месте. Распространённый паттерн — итерировать по кортежу и собирать результаты в новый список.
Создание списка квадратов из кортежа
numbers = (1, 2, 3, 4, 5)
squares = [n ** 2 for n in numbers]
print(squares)Вывод:
[1, 4, 9, 16, 25]Включение списка перебирает кортеж так же, как цикл for, и является более лаконичным для простых преобразований. Подробнее о работе с данными кортежей читайте в разделах Python Tuples и Tuple Methods.
Когда использовать каждую технику
| Цель | Лучший подход |
|---|---|
| Обойти каждый элемент по порядку | for item in my_tuple |
| Нужен также индекс | enumerate() |
| Нужен точный контроль над индексом | цикл while или range(len()) |
| Перебирать два кортежа одновременно | zip() |
| Обход строк в кортеже кортежей | вложенные циклы for |
| Остановиться досрочно или пропустить элементы | break / continue |