В этом уроке мы поговорим о таком типе данных как списки: как с ними можно работать и где применять. Списки это то, с чем я в своей работе сталкиваюсь буквально каждый день. Да и вы, кстати тоже, просто возможно не догадываетесь об этом. Поэтому давайте разбираться! 

Видео: Глеб Лиманский

В предыдущих уроках, где мои коллеги рассказывали про строки или циклы, вы точно встречали вот такую штуку в квадратных скобках — [1, 2, 3, 4, 5]. Это и есть список. Или list на языке Python. Списки в Python — это просто некий набор упорядоченных объектов. Списки могут содержать разные данные: это могут целые и дробные числа, строчки. В списках могут храниться даже сами списки.

Списки можно создавать не только вручную, но и с помощью функции. Чтобы создать пустой список, можно использовать list() или просто квадратные скобки []. Результат будет одинаковым.

Давайте создадим список с элементами разного типа и назовем его my_list. И с помощью изученного в прошлом уроке цикла for выясним тип данных для каждого элемента списка.

Чтобы узнать длину списка, то есть сколько элементов в нем содержится, нужна команда len(my_list). Эта же командой можно проверять и длину строк.

К элементам в списке мы можем обращаться по-разному. Не только с помощью циклов. Например, если мы знаем порядковый номер элемента в списке, то есть его индекс, то можем по нему обратиться к элементу. Например, мы знаем, что в нашем my_list = [1, 1.4, 'line', [1, 2, 3], 1.4] элемент «line» третий по счету, но если считать по-питоновски, то есть от 0, то получается, что второй. То есть индекс элемента «line» — 2. Поэтому обратиться к этому элементу мы можем вот так — my_list[2] — сначала название списка, а затем в квадратных скобках нужно указать индекс.

Но когда элементов в списке очень много и просто глазами определить индекс каждого элемента не получается, можно узнать его с помощью команды .index(). Сначала нужно указать название списка, потому команду, а в скобках сам элемент, индекс которого вы хотите определить, — my_list.index(1.4). В ответ мы получим 1.

Только учтите, если у вас есть несколько одинаковых элементов в списке, то это команда вернет вам индекс того, что стоит первым в списке.

Пока что я вручную создавала списки и добавляла в них элементы, но так во взрослой жизни не делается. Для того, чтобы добавить элемент в список используется специальная команда .append(). И указанный в скобках элемент добавляется в конец списка. 

Команда .insert() тоже добавляет элементы в список, но в определенное место. Первым параметром вы вводите индекс, по которому нужно разместить элемент, а вторым параметром — сам элемент. В output можно увидеть, что элемент встраивается в список ровно на то место, которое мы указали, а все остальные элементы смещаются вправо от него.

Также есть и специальная команда для удаления элементов из списка — .remove(), где в скобочках нужно указать, какой именно элемент должен быть удален из списка. Но если таких элементов в списке несколько, удалится только самый первый. Если вы попросите удалить элемент, которого нет в списке, то вы получите ошибку. Давайте удалим элемент 100 из списка.

Также списки можно сортировать с помощью функции sorted(). Давайте создадим новый список в числами number_list = [3, 49, 1, 16]. И применим к нему sorted(). Мы увидим, в output отсортированный от меньшего к большему список.

Здесь важно понимать, что после применения sorted() исходный number_list на самом деле никак не изменило. Для того, чтобы сохранить список в отсортированном виде, нужно сохранить sorted(number_list) в переменную.

Сортировать можно, кстати, не только числа в списках, но и строки.

Давайте теперь попрактикуемся и попробуем написать небольшую программу. Она будет 5 раз просить пользователя ввести число и каждое из этих чисел добавлять в список. А потом распечатает нам список из этих 5 чисел. Если вы знаете, как решить эту задачку, то попробуйте сначала сами написать код, а потом сверьтесь с моей версией.

Для начала нужно создать пустой список, куда будут собираться числа, которые ввел пользователь. А дальше с помощью цикла for i in range(5) мы обозначим, что хотим пять раз совершить какую-то операцию. Для начала пять раз с помощью input(«Введите число») попросим пользователя ввести число. А затем введенное число сохраним в наш список. И распечатаем наш список.

Теперь давайте усложним задачу. Теперь программа должна просить пользователя 5 раз ввести четное число, проверять, действительно ли оно четное. Если да, то добавлять в список, если нет, то выводить пользователю на экране *введенное пользователем число* не делится на 2 без остатка.

Для того, чтобы проверять четное число или нет можно использовать деление через %, которое возвращает остаток от деления. Если вы напишете 4%2, то в output будет 0, потому что остатка нет.

Или еще пример. Иногда бывает так, что у вас есть какие-то данные, но в них есть грязь, которую лучше бы вычистить прежде чем приступать к анализу. Например, у нас есть вот такой список — my_list = ['2%', "45 %", '6%', “11”, ‘15 %’] . Давайте очистим каждый элемент от лишнего знака %.

Я думаю, вы уже поняли, почему в самом начале урока я сказала, что мы очень часто сталкиваемся со списками по работе. Потому что такой список, это не что иное как просто строчка в таблице. А таблица — это просто список списков. Давайте разберем на другом очень жизненном примере.

Допустим у вас есть данные о количестве преступников в каких-то населенных пунктах — crimes = [30000, 10000, 200]. И мы хотим узнать, в каком из этих населенных пунктах самая криминогенная обстановка. И вы мне скажете: «Так давай используем функцию max(crimes) и она вернет нам это самое большое значение из списка crimes и мы разойдемся.» Технически это будет правильный ответ. Но не все так просто. Показатели типа количества преступников, детей сирот, людей с алкогольной зависимость и так далее обязательно нужно нормировать на количество всех людей проживающих в этом населенном пункте. Иначе всегда бы оказывалось, что Москва самый опасный город в России просто потому, что в Москве живет больше всего людей. Поэтому нам пригодится еще одна строчка в таблице, то есть еще один список — population = [100000, 50000, 1000]. И дальше нам нужно будет по формуле количество преступников/население * 1000 рассчитать число преступников на 1000 человек.

Давайте создадим пустой список norm_crimes = [], в который будем собирать нормированный показатель.

В итоге если мы объединим все три списка в один, то по сути получим обычную таблицу.

Если бы мы сохранили этот наш список списков в xls или csv и открыли бы этот файл в табличном редакторе, то он выглядел бы как обычная таблица.

Можем еще добить нашу табличку, посчитав сумму всех преступников, сумму населения для всех населенных пунктов и общий нормированный показатель для всех населенных пунктов. Чтобы узнать сумму всех чисел в списке, нам не нужно ходить циклом по списку и прибавлять один элемент за другим. Можно использовать sum().

И с помощью команды .append() давайте добавим эти показатели в соответсвующие им списки.

Теперь полученные данные мы могли бы использовать для материала или дальнейшего анализа!)

В этом уроке я рассказала об основных методах и функциях списков, но не обо всех. Как и для чего применяются другие функции можете посмотреть вот здесь. Тетрадку Jupyter Notebook с этим уроком можно найти в нашем GitHub здесь. А если хотите порешать задачки для тренировки, то мы собрали их здесь.