Сортировка и поиск элементов

Сортировка и поиск элементов

Работа со списками редко обходится без двух базовых операций: найти нужный элемент и упорядочить список. Python предоставляет богатый набор инструментов для обоих задач.

Поиск: оператор in

Самый простой способ — проверить наличие элемента через in:

fruits = ["яблоко", "банан", "вишня"]

if "банан" in fruits:
    print("Банан есть в списке")

print("манго" not in fruits)   # True

Операция in для списка работает за O(n) — просматривает весь список.

Поиск индекса: index()

Метод index(value) возвращает индекс первого вхождения значения:

nums = [10, 20, 30, 20, 40]

print(nums.index(20))   # 1 — первое вхождение
print(nums.index(40))   # 4

# С указанием диапазона:
print(nums.index(20, 2))   # 3 — искать с позиции 2

Если значение не найдено — ValueError. Поэтому сначала проверяйте через in:

target = 99
if target in nums:
    pos = nums.index(target)
    print(f"Найден на позиции {pos}")
else:
    print("Не найден")

Подсчёт вхождений: count()

letters = ["a", "b", "a", "c", "a", "b"]
print(letters.count("a"))   # 3
print(letters.count("b"))   # 2
print(letters.count("z"))   # 0 — нет элемента → 0, не ошибка

Встроенные функции для чисел

min(), max(), sum() работают со списками напрямую:

scores = [85, 92, 78, 95, 88]

print(min(scores))     # 78
print(max(scores))     # 95
print(sum(scores))     # 438
print(sum(scores) / len(scores))   # 87.6 — среднее

Сортировка: sort()

Метод sort() сортирует список на месте (изменяет исходный список):

nums = [3, 1, 4, 1, 5, 9, 2, 6]
nums.sort()
print(nums)   # [1, 1, 2, 3, 4, 5, 6, 9]

По умолчанию — возрастающий порядок. Для убывающего — reverse=True:

nums.sort(reverse=True)
print(nums)   # [9, 6, 5, 4, 3, 2, 1, 1]

Строки сортируются лексикографически:

words = ["банан", "яблоко", "абрикос", "вишня"]
words.sort()
print(words)   # ['абрикос', 'банан', 'вишня', 'яблоко']

sorted(): сортировка без изменения оригинала

Встроенная функция sorted() возвращает новый отсортированный список, не трогая исходный:

original = [3, 1, 4, 1, 5, 9]
ordered = sorted(original)

print(original)   # [3, 1, 4, 1, 5, 9] — не изменился
print(ordered)    # [1, 1, 3, 4, 5, 9]

# В обратном порядке:
desc = sorted(original, reverse=True)
print(desc)   # [9, 5, 4, 3, 1, 1]

Когда использовать sort(), а когда sorted():

  • sort() — когда нужно изменить исходный список, без создания нового.
  • sorted() — когда нужно сохранить оригинал или отсортировать что-либо, кроме списка (строку, кортеж).

Сортировка с ключом: key=

Параметр key позволяет задать функцию, которая вычисляет «ключ сортировки» для каждого элемента:

# По длине строки:
words = ["банан", "яблоко", "киви", "абрикос"]
words.sort(key=len)
print(words)   # ['киви', 'банан', 'яблоко', 'абрикос']

# По последнему символу:
words.sort(key=lambda w: w[-1])   # lambda — функция-однострочник
print(words)

len — встроенная функция, которая возвращает длину. При передаче в key она применяется к каждому элементу для определения порядка. К lambda-функциям вернёмся в модуле 8.

Сортировка по убыванию с ключом

students = [("Алиса", 92), ("Борис", 85), ("Вера", 97)]
students.sort(key=lambda s: s[1], reverse=True)   # по оценке, по убыванию
for name, score in students:
    print(f"{name}: {score}")
# Вера: 97
# Алиса: 92
# Борис: 85

reversed(): обратный порядок

reversed() возвращает итератор в обратном порядке (не изменяет список):

nums = [1, 2, 3, 4, 5]
for n in reversed(nums):
    print(n, end=" ")   # 5 4 3 2 1

# Или преобразовать в список:
rev_list = list(reversed(nums))
print(rev_list)   # [5, 4, 3, 2, 1]

Метод .reverse() (в отличие от функции reversed()) изменяет список на месте.

Проверь себя

Что выведет следующий код?

data = [5, 3, 8, 1, 9, 2]
print(sorted(data))
print(data)
data.sort()
print(data)
  • sorted(data)[1, 2, 3, 5, 8, 9] (новый список)
  • data[5, 3, 8, 1, 9, 2] (не изменился)
  • data.sort() изменяет список на месте
  • Последний print(data)[1, 2, 3, 5, 8, 9]

Итог

  • in / not in — проверка вхождения за O(n).
  • index(x) — индекс первого вхождения; ValueError если нет.
  • count(x) — количество вхождений.
  • min(), max(), sum() — встроенные агрегатные функции.
  • sort() — сортировка на месте; sorted() — новый отсортированный список.
  • key= в sort() и sorted() позволяет задать критерий сортировки.
  • reverse=True — убывающий порядок.

В следующем уроке изучим list comprehensions — компактный синтаксис для создания списков по формуле.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике