W3docs

Перебор кортежей в 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

python— editable, runs on the server

Вывод:

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 blue

enumerate() предпочтительнее 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 92

zip() останавливается, как только заканчивается самый короткий кортеж, поэтому несовпадение длин не вызывает ошибку — лишние элементы просто отбрасываются. Если нужны все пары с заполнением пропусков, используйте 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

Практика

Практика
Which built-in function returns both the index and value when looping over a Python tuple?
Which built-in function returns both the index and value when looping over a Python tuple?
Was this page helpful?