Сортировка и поиск элементов
Сортировка и поиск элементов
Работа со списками редко обходится без двух базовых операций: найти нужный элемент и упорядочить список. 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 — компактный синтаксис для создания списков по формуле.