Списки — это изменяемые коллекции элементов (например, переменных: числовых данных, строк и проч.) различных типов. Они очень похожи на массивы (если вы раньше были с ними знакомы, но если нет, то не страшно), но, тем не менее, это не одно и то же. В отличие от массивов, списки могут хранить в себе данные разных типов, например:
s = [1,2,'apple', 3.14]
Как мы видим, в этом списке есть представители типов int, str, и float. В языке Python такое осуществимо, что, несомненно, очень удобно. Кроме того, мы можем поместить список в список:
l = [123, ['l', 'f']]
print(l[2]) # ['l', 'f']
Индексы
В примере выше показано, каким образом осуществляется вывод элемента списка по его индексу. Давайте разберёмся, что такое индексы и соответствующие им значения.
Давайте создам список с произвольными числами. В моём случае это будут буквы английского алфавита.
Синтаксис списка: название = [значение1, значение2, значение3]
Обязательно в квадратных скобках!
s = ['a','b','c','d','e','f','g','h','i','j','k'] — список содержащий в себе 11 элементов
Каждому элементу списка присваивается индивидуальный индекс, по которому мы можем обращаться к соответствующему элементу. Нумерация индексов в Python начинается с нуля. Это означается, что значению 'a' будет соответствовать индекс «0», значению 'b' — индекс «1», значению 'c' — индекс «2» и так далее до последнего значения 'k', индекс которого равен длине списка минус 1, то есть «10»
Обращаю ваше внимание на то, что для нас не составляет особо труда узнать длину списка, для этого в Python реализована функция len(), в качестве аргумента которой мы должны передать наш список.
print(len(s)) # 11
Срезы
Взаимодействие со списками не ограничивается только взятием значения по индексу. Кроме этого мы можем брать срезы. Давайте посмотрим на пример:
s = ['a','b','c','d','e','f','g','h','i','j','k']
print(s[2:5]) # ['c', 'd', 'e']
Что же произошло? Если изъясняться простым языком, то мы взяли «кусок» списка по соответствующим индексам, которые в своей купе представляют из себя определённый отрезок значений. Синтаксис взятия среза выглядит следующим образом:
s[start:stop:step] — где start — это начало среза, stop — конец среза, step — шаг, с которым будет браться срез. Ненужные значения мы можем опускать, но при этом нам важно сохранение двоеточий, чтобы интерпретатор понимал, что ему необходимо сделать.
Давайте посмотрим на разные примеры взятия срезов на примере списка выше:
print(s[2:5]) # ['c', 'd', 'e']
print(s[1:7:2]) # ['b', 'd', 'f'] — диапазон индексов луч [1;7) или отрезок [1;6] c шагом 2, то на вывод идут значения 'b' (имеющий индекс «1»)→ +2 → 'd' (имеющий индекс «3»)→ +2 → 'f' (имеющий индекс «5»)
print(s[:4]) — стартовое значение пропущено, таким образом диапазон индексов- луч [0;4) или отрезок [0;3), т.к. значение шага идёт после конечного значения, то следующее двоеточие, отделяющее конечное значение индекса от шага, указывать необязательно.
print(s[3:]) — конечное значение опущено, таким образом диапазон индексов — луч [3;len(s)-1) или отрезок [3;len(s)-2].
Очень удобная возможность перевернуть список без написания большого количества строк кода — это использование срезов. Пример:
s[::-1] # ['k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
Так мы плавно подошли к особенности индексации элементов в Python — отрицательным индексам. Что такое отрицательный индекс? Давайте разбираться.
Представим себе всё тот же список выше, только написав под каждым его элементом его индекс.
Индексы, у всех элементов неотрицательные, то есть больше -1. Давайте попробуем взять элемент данного списка по индексу «-1», «-2» и так далее.
s[-1] # 'k'
s[-2] # 'j'
s[-3] # 'i'
Как мы можем заметить по картинке выше, диапазон значений расширился и теперь распространяется не только на неотрицательные, но и на отрицательные значения индексов. Таким образом, возвращаясь к примеру с переворачиванием строки
s[::-1] # ['k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
мы указывает отрицательный step и список выводится с обратной стороны.
Сложение и умножение списков
Списки можно умножать и складывать, выглядит это так:
s1 = [1,2,3]
s2 = [4,5,6]
print(s1*3) # [1,2,3,1,2,3,1,2,3]
print(s1+s2) # [1,2,3,4,5,6]
Методы
В Python метод – это функция, доступная для данного объекта из-за типа объекта. Хоть с определением функции мы пока не знакомы, давайте условимся, что под функцией мы будем понимать код применимый к какому-то объекту языка, код, который выполняет какое-то полезное действие.
И вишенка на торте — это обширные возможности взаимодействия со списками с помощью методов, давайте рассмотрим несколько из них.
s.append(x) — добавляет элемент x в конец списка s
s = ['a', 'j', 'k']
s.append('m')
print(s) # ['a', 'j', 'k', 'm']
s.extend(l) — добавляет элементы списка l в список s (расширяет список s)
l = [4,5,6]
s = [1,2,3]
s.extend(l)
print(s) # [1,2,3,4,5,6]
s.insert(i, x) — вставляет элемент x по индексу i, смещаю имеющиеся
s = [1,2,3]
s.insert(0,4)
print(s) # [4,1,2,3]
s.remove(x) — удаляет элемент со значением x из списка s
s = [4,5,6]
s.remove(5)
print(s) # [4,6]
s.index(x,start,end) — возвращает индекс первого вхождения элемента x в список s. Значения start и end ограничивают диапазон поиска значения x.
s = [1,1,1,1,0,1,1,1,0,1,1,1]
s.index(0) # 4
s.index(0,6,11) # 8
s.count(x) — подсчитывает количество вхождений элемента x в список s
s = [1,1,1,1,0,1,1,1,0,1,1,1]
s.count(0) # 2
s.reverse() — разворачивает список s
s = [1,2,3]
s.reverse()
print(s) # [3,2,1]
s.clear() — очищение списка s
s = [1,2,3]
s.clear()
print(s) # []