Научимся создавать списки. Освоим различные способы преобразования списков и разберемся, для каких задач они нужны.
Что такое список и как его создать
Списком в языке программирования Python можно назвать упорядоченную коллекцию элементов, которые могут иметь любой тип данных и которые можно как угодно изменять. Эти элементы можно удалять, заменять другими элементами, а также добавлять новые.
Приведем пример создания списка, содержащего названия планет земной группы:
planets = ["Меркурий", "Венера", "Земля", "Марс"]
Чтобы вывести элементы списка в консоль, можно добавить такую строку:
print(planets)
В результате выполнения последней команды в консоли будет выведено следующее:
['Меркурий', 'Венера', 'Земля', 'Марс']
Также список можно создать при помощи конструктора list. Так создается пустой список:
empty_list = list()
А вот так можно создать копию уже существующего списка:
planets = ["Меркурий", "Венера", "Земля", "Марс"] terrestrial_planets = list(planets) print(terrestrial_planets)
Еще с помощью list можно создать список из строки:
hello_letters = list("Привет") print(hello_letters)
Вывод в консоли будет таким:
['П', 'р', 'и', 'в', 'е', 'т']
Как видим, в создании списков нет ничего сложного. Далее рассмотрим, как можно работать со списками и проводить над ними различные преобразования.
Обращение к элементам списка по индексу
Для примера возьмем тот же самый список с планетами земной группы. Попробуем вывести в консоль первый элемент списка. Для этого нам необходимо знать индекс элемента. Отсчет (индексация) элементов в списке начинается с нуля, поэтому индекс у первого элемента будет равен нулю, у второго — единице и так далее. Чтобы вывести первый элемент, нужно написать:
print(planets[0])
В консоли должно появиться название первой планеты — Меркурий. Выведем поочередно названия всех планет из списка:
print(planets[0]) print(planets[1]) print(planets[2]) print(planets[3])
В консоли будет выведено:
Меркурий Венера Земля Марс
Получили все элементы списка.
Присвоение нового значения
Иногда бывает нужно изменить один из элементов в списке. Для этого достаточно обратиться к элементу через индекс и присвоить ему новое значение. Присвоим новое значение элементу Марс:
planets[3] = "Красная планета"
Теперь, если мы выведем все элементы нашего списка в консоль, то увидим следующее:
Меркурий Венера Земля Красная планета
Новое значение успешно присвоено.
Разложение списка на переменные
В этом случае происходит создание отдельных переменных для каждого элемента списка. Сделаем это для нашего набора планет:
planets = ["Меркурий", "Венера", "Земля", "Марс"] mercury, venus, earth, mars = planets
Следует учитывать, что количество переменных должно быть равно количеству элементов списка. Теперь в консоль все это можно вывести так:
print(mercury) print(venus) print(earth) print(mars)
Понятно, что разложение таким способом имеет смысл только для небольших списков. В случае больших списков лучше всего применять обращение к элементам по индексу.
Перебор элементов с помощью циклов
Перебрать все элементы списка можно с помощью цикла for или while. Сначала сделаем это при помощи цикла for:
planets = ["Меркурий", "Венера", "Земля", "Марс"] for planet in planets: print(planet)
В цикле создается переменная planet, в которую записывается элемент списка. То есть при каждой новой итерации (прохождении цикла) переменная перезаписывается и ее значение выводится в консоль. Теперь сделаем перебор при помощи цикла while:
planets = ["Меркурий", "Венера", "Земля", "Марс"] i = 0 while i < len(planets): print(planets[i]) i += 1
Здесь создается переменная i, выполняющая роль счетчика итераций. В условии цикла ее значение сравнивается с длиной списка, которая получается при помощи функции len. В теле цикла при каждой итерации значение переменной i увеличивается на единицу, и, как только это значение станет равным длине списка, цикл прекратит выполняться. Значение переменной i — это индекс элемента в списке. В итоге мы получим все тот же список планет, выведенный в консоли.
Получение части списка
При желании можно получить часть списка. Для этого опять же понадобятся индексы элементов. Например, чтобы получить названия только первых трех планет из нашего списка, напишем:
slice_planets = planets[:3]
Мы получили новый список slice_planets. Выведем его в консоль командой print(slice_planets). Получим:
['Меркурий', 'Венера', 'Земля']
Чтобы вывести названия только второй и третьей планеты, напишем так:
slice_planets = planets[1:3] print(slice_planets)
Вывод будет таким:
['Венера', 'Земля']
В квадратных скобках на первом месте указываем индекс элемента, начиная с которого создается новый список (ноль можно не писать), а на втором месте — индекс элемента, до которого создается новый список.
Сравнение списков
Если нам даны два списка, содержащие один и тот же набор элементов, то эти списки считаются равными. Сравним вот эти списки:
planets1 = ["Меркурий", "Венера", "Земля", "Марс"] planets2 = ["Меркурий", "Венера", "Земля", "Марс"]
Сравним их при помощи конструкции if — else:
if planets1 == planets2: print("Списки равны") else: print("Списки не равны")
Понятно, что в этом случае мы получим сообщение о равенстве списков. А теперь поменяем местами Меркурий с Венерой:
planets1 = ["Меркурий", "Венера", "Земля", "Марс"] planets2 = ["Венера", "Меркурий", "Земля", "Марс"]
После сравнения мы получим сообщение о неравенстве списков. Оно и понятно: хоть списки и содержат одни и те же элементы, но порядок этих элементов разный.
Добавление элементов
Для добавления нового элемента в список можно использовать метод append. Этот метод добавляет элемент в конец списка. Возьмем наш список планет земной группы и добавим в него планету Юпитер:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.append("Юпитер") print(planets)
В консоль будет выведено следующее:
['Меркурий', 'Венера', 'Земля', 'Марс', 'Юпитер']
Еще есть метод insert, при помощи которого можно вставить элемент на выбранную позицию. Допустим, нам дан список планет без Венеры:
planets = ["Меркурий", "Земля", "Марс"]
Вставим Венеру на вторую позицию. Для этого в качестве параметров в методе insert укажем индекс позиции и название планеты:
planets.insert(1, "Венера") print(planets)
Вывод будет таким:
['Меркурий', 'Венера', 'Земля', 'Марс']
Также имеется метод extend. С его помощью можно добавлять в список целые наборы элементов. Добавим к планетам земной группы планеты-гиганты:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.extend(["Юпитер", "Сатурн", "Уран", "Нептун"]) print(planets)
В консоли будет выведен весь набор планет Солнечной системы:
['Меркурий', 'Венера', 'Земля', 'Марс', 'Юпитер', 'Сатурн', 'Уран', 'Нептун']
Теперь поговорим об удалении элементов.
Удаление элементов
Для удаления элемента из списка отлично подходит метод remove. Удалим, например, Марс из нашего списка планет земной группы:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.remove("Марс") print(planets)
Вывод в консоли будет такой:
['Меркурий', 'Венера', 'Земля']
Также для удаления элементов можно использовать метод pop. Если этот метод использовать без параметров, то будет удален последний элемент списка:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.pop() print(planets)
В данном примере результат будет такой же, как и в предыдущем: удалится Марс из списка. Если же передать методу pop индекс элемента в качестве параметра, то элемент с этим индексом и будет удален. Удалим, например Землю из списка:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.pop(2) print(planets)
Результат:
['Меркурий', 'Венера', 'Марс']
С помощью метода clear можно удалить вообще все элементы:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets.clear() print(planets)
В результате получим это:
[]
Получили пустой список, так как все элементы были удалены.
Проверка наличия элемента и подсчет вхождений
Иногда бывает полезно проверить, существует ли элемент в списке. Например, такую проверку полезно делать перед удалением элемента. Возьмем код с удалением Марса из прошлого раздела и добавим в него проверку наличия Марса в списке:
planets = ["Меркурий", "Венера", "Земля", "Марс"] if "Марс" in planets: planets.remove("Марс") print(planets)
Все дело в том, что метод remove генерирует исключение в случае, если удаляемый элемент не будет найден. Чтобы этого не произошло, нужно сначала проверить наличие элемента в списке.
Чтобы подсчитать количество того или иного элемента в списке, можно применить метод count:
planets = ["Меркурий", "Венера", "Земля", "Марс"] planets_count = planets.count("Земля") print(planets_count)
Понятно, что в данном случае в консоль будет выведена единица. Такой подсчет может быть полезен для выявления и последующего удаления ненужных дубликатов.
Сортировка
Для сортировки элементов по возрастанию применяется метод sort. Возьмем последовательность чисел от 0 до 9, расставленных в случайном порядке:
numbers = [9, 7, 1, 3, 4, 5, 2, 6, 8, 0]
Отсортируем ее и выведем в консоль:
numbers.sort() print(numbers)
В консоли получим:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Чтобы получить последовательность чисел в порядке убывания, нужно сразу после сортировки применить метод reverse:
numbers.sort() numbers.reverse() print(numbers)
Результат:
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Если применить сортировку к списку планет, то после сортировки планеты будут расставлены в алфавитном порядке. Возьмем полный список планет:
planets = ["Меркурий", "Венера", "Земля", "Марс", "Юпитер", "Сатурн", "Уран", "Нептун"] planets.sort() print(planets)
В итоге получим такой вывод:
['Венера', 'Земля', 'Марс', 'Меркурий', 'Нептун', 'Сатурн', 'Уран', 'Юпитер']
А дальше мы предлагаем решить небольшую задачку.
Задание для самостоятельного выполнения
Имеется следующий список:
numbers = [5, 5, 2, 1, 1, 1, 7, 7]
Требуется удалить дубликаты при помощи методов count и remove.
Решение
Для решения этой задачи можно воспользоваться циклом for, который будет последовательно перебирать элементы в списке. В тело цикла помещаем условный оператор if. Он сравнивает результат подсчета одинаковых элементов, и если результат окажется больше единицы, то происходит удаление элемента. Код будет примерно таким:
numbers = [5, 5, 2, 1, 1, 1, 7, 7] for i in numbers: if numbers.count(i) > 1: numbers.remove(i) print(numbers)
Результат:
[5, 2, 1, 7]
Казалось бы, все прекрасно и решение найдено. Но попробуйте добавить в конец списка еще одну семерку:
numbers = [5, 5, 2, 1, 1, 1, 7, 7, 7]
В результате получим:
[5, 2, 1, 7, 7]
Не все дубликаты были удалены. Это можно исправить, если заставить цикл работать не с исходным списком, а с его копией. В этом случае преобразования будут вестись в исходном списке, а перебор элементов — в его копии. Тогда код получается такой:
numbers = [5, 5, 2, 1, 1, 1, 7, 7, 7] for i in list(numbers): if numbers.count(i) > 1: numbers.remove(i) print(numbers)
Результат:
[5, 2, 1, 7]