Методы кортежей
Изучите встроенные методы кортежей 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 — ошибка никогда не возникает.
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.
Необязательные параметры 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()
Возвращает общее количество элементов:
min() и max()
Возвращают наименьший и наибольший элементы. Элементы должны быть сравнимы между собой (все числа или все строки):
scores = (72, 95, 88, 61, 100)
print(min(scores)) # 61
print(max(scores)) # 100sum()
Возвращает арифметическую сумму числового кортежа:
prices = (9.99, 4.49, 14.99)
print(sum(prices)) # 29.47
print(sum(prices, 5.00)) # 34.47 — optional start valuesorted()
Возвращает новый список (не кортеж) с элементами, отсортированными по возрастанию. Исходный кортеж остаётся неизменным:
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(), они часто встречаются при работе с кортежами.
Конкатенация
Используйте + для объединения двух кортежей в новый:
Другие способы объединения кортежей описаны в разделе 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 — изменяемый аналог с гораздо большим количеством методов