W3docs

Методы кортежей

Изучите встроенные методы кортежей Python count() и index() с практическими примерами, особыми случаями и советами по работе с неизменяемыми последовательностями.

Кортеж Python — это упорядоченная неизменяемая последовательность. Поскольку кортежи нельзя изменить после создания, они предоставляют только два встроенных метода: count() и index(). На этой странице подробно рассматриваются оба метода, включая их необязательные параметры, распространённые подводные камни, а также встроенные функции (len(), min(), max(), sum(), sorted()), которые одинаково хорошо работают с кортежами.

Если вы только знакомитесь с кортежами, сначала прочитайте Python Tuples. О доступе к элементам по позиции или срезу читайте в разделе Access Tuples.

Краткий справочник

Метод / ФункцияЧто возвращает
t.count(x)Количество вхождений x в кортеже
t.index(x)Индекс первого вхождения x
t.index(x, start)Первое вхождение x начиная с позиции start
t.index(x, start, stop)Первое вхождение x в пределах t[start:stop]
len(t)Общее количество элементов
min(t) / max(t)Наименьший / наибольший элемент
sum(t)Сумма всех элементов (только числа)
sorted(t)Возвращает новый список с упорядоченными элементами

Почему так мало методов?

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

Метод count()

tuple.count(value) просматривает весь кортеж и возвращает количество вхождений value. Если значение не найдено, возвращается 0 — ошибка никогда не возникает.

python— editable, runs on the server

count() с вложенными кортежами

count() использует сравнение на равенство (==), поэтому работает с элементами любого типа, включая вложенные кортежи:

points = ((0, 0), (1, 2), (0, 0), (3, 4))

print(points.count((0, 0)))  # 2
print(points.count((1, 2)))  # 1

Особенность: True и 1 равны

Python считает True == 1 и False == 0, поэтому count() подсчитывает их как взаимозаменяемые:

data = (1, True, 0, False, 1)

print(data.count(1))     # 3  (counts 1, True, 1)
print(data.count(True))  # 3  (same three elements)
print(data.count(0))     # 2  (counts 0 and False)

Это стандартное поведение Python при сравнении на равенство, а не особенность кортежей.

Метод index()

tuple.index(value) возвращает индекс первого вхождения value. Если значение отсутствует, возникает исключение ValueError.

python— editable, runs on the server

Необязательные параметры start и stop

Полная сигнатура: tuple.index(value, start, stop). Можно сузить диапазон поиска, чтобы не находить повторно уже известное вхождение:

numbers = (10, 20, 30, 20, 40, 20)

# Find first occurrence of 20 starting at index 2
print(numbers.index(20, 2))     # 3

# Find 20 only within numbers[2:5]  →  (30, 20, 40)
print(numbers.index(20, 2, 5))  # 3

Индекс stop является исключающим, что соответствует соглашениям срезов в Python.

Обработка ValueError

Всегда проверяйте наличие значения перед вызовом index(), если оно может отсутствовать:

animals = ("cat", "dog", "bird")

target = "fish"
if target in animals:
    pos = animals.index(target)
    print(f"Found {target!r} at index {pos}")
else:
    print(f"{target!r} is not in the tuple")
# fish is not in the tuple

Можно также использовать блок try / except:

try:
    pos = animals.index("fish")
except ValueError:
    pos = -1  # sentinel value when not found

print(pos)  # -1

Встроенные функции, работающие с кортежами

Хотя следующие функции не являются методами кортежей, они принимают любой итерируемый объект — включая кортежи — и часто используются вместе с ними.

len()

Возвращает общее количество элементов:

python— editable, runs on the server

min() и max()

Возвращают наименьший и наибольший элементы. Элементы должны быть сравнимы между собой (все числа или все строки):

scores = (72, 95, 88, 61, 100)

print(min(scores))  # 61
print(max(scores))  # 100

sum()

Возвращает арифметическую сумму числового кортежа:

prices = (9.99, 4.49, 14.99)
print(sum(prices))   # 29.47
print(sum(prices, 5.00))  # 34.47  — optional start value

sorted()

Возвращает новый список (не кортеж) с элементами, отсортированными по возрастанию. Исходный кортеж остаётся неизменным:

letters = ("d", "a", "c", "b")

asc = sorted(letters)          # ascending (default)
desc = sorted(letters, reverse=True)  # descending

print(asc)   # ['a', 'b', 'c', 'd']
print(desc)  # ['d', 'c', 'b', 'a']
print(letters)  # ('d', 'a', 'c', 'b')  — unchanged

Чтобы получить отсортированный кортеж вместо списка, оберните результат в tuple():

sorted_tuple = tuple(sorted(letters))
print(sorted_tuple)  # ('a', 'b', 'c', 'd')

Распространённые операции с кортежами (не методы)

Хотя следующие паттерны не используют .count() или .index(), они часто встречаются при работе с кортежами.

Конкатенация

Используйте + для объединения двух кортежей в новый:

python— editable, runs on the server

Другие способы объединения кортежей описаны в разделе Join Tuples.

Преобразование кортежа в список (и обратно)

Поскольку кортежи неизменяемы, преобразуйте их в list, когда нужно изменить содержимое, а затем конвертируйте обратно:

t = (1, 2, 3)
lst = list(t)
lst.append(4)
t2 = tuple(lst)
print(t2)  # (1, 2, 3, 4)

Полное руководство по шаблонам изменения данных см. в разделе Update Tuples.

Проверка принадлежности

Используйте in и not in вместо index(), когда вам нужен просто ответ «да» или «нет»:

fruits = ("apple", "banana", "cherry")

print("banana" in fruits)      # True
print("mango" not in fruits)   # True

Это более читаемо и позволяет избежать ValueError, которую вызывает index() при отсутствии значения.

Выбор между count() и index()

ЦельИспользование
Сколько раз встречается x?t.count(x)
Где находится первый x?t.index(x)
Существует ли x вообще?x in t
Где находится второй (или n-й) x?t.index(x, first_pos + 1)

Связанные главы

  • Python Tuples — основы кортежей и синтаксис создания
  • Access Tuples — индексирование и срезы
  • Update Tuples — обходные пути для неизменяемости
  • Unpack Tuples — деструктурирующее присваивание
  • Loop Tuples — итерация с помощью for и while
  • List Methods — изменяемый аналог с гораздо большим количеством методов

Практика

Практика
Which of the following are methods applicable to Python tuples?
Which of the following are methods applicable to Python tuples?
Was this page helpful?