Списки в Python
Срезы, сортировка, агрегаты и включения — самая рабочая часть языка.
Список: создание, индексы, len
cart = ['coffee', 'tea', 'juice']
len(cart) # 3
cart[0] # 'coffee'
cart[-1] # 'juice'
cart[3] # IndexError Индексы идут с нуля, минус считает с конца. Последний элемент — cart[-1], а вот cart[len(cart)] всегда падает с IndexError.
Добавить и удалить: append, insert, remove, pop
cart = ['coffee', 'tea']
cart.append('juice') # ['coffee', 'tea', 'juice']
cart.insert(0, 'water') # ['water', 'coffee', 'tea', 'juice']
cart.remove('tea') # by value
last = cart.pop() # 'juice', and it is removed append добавляет в конец, insert — по индексу, remove ищет по значению, pop снимает по индексу и возвращает элемент. remove убирает только первое совпадение.
Срезы: часть списка и разворот
items = [10, 20, 30, 40, 50]
items[1:3] # [20, 30]
items[:2] # [10, 20]
items[-2:] # [40, 50]
items[::-1] # [50, 40, 30, 20, 10] Срез [a:b] берёт элементы с индекса a до b, не включая b, минус считает с конца; работает и со строками. [::-1] возвращает перевёрнутую копию, исходный список не меняется.
Сортировка: sorted, key и reverse
prices = [349, 99, 199]
sorted(prices) # [99, 199, 349]
sorted(prices, reverse=True) # [349, 199, 99]
words = ['banana', 'fig', 'apple']
sorted(words, key=len) # ['fig', 'apple', 'banana'] sorted возвращает новый список, а items.sort() сортирует на месте и возвращает None — результат sort присваивать нельзя. key задаёт, по чему сравнивать элементы.
sum, min, max по списку
prices = [349, 99, 199]
sum(prices) # 647
min(prices) # 99
max(prices) # 349
sum(prices) / len(prices) # 215.66... Готовые агрегаты вместо цикла со счётчиком; среднее — sum / len. На пустом списке min и max падают с ValueError — проверь длину заранее.
Списковое включение
prices = [349, 99, 199]
doubled = [p * 2 for p in prices] # [698, 198, 398]
cheap = [p for p in prices if p < 200] # [99, 199] Включение строит новый список из старого в одну строку: слева выражение, справа цикл и фильтр. Если читать стало трудно — разверни в обычный for.