Списки

В данной теме мы узнаем, что представляют собой списки и как начать работать с элементами списка. Списки позволяют хранить в одном месте взаимосвязанные данные, сколько бы их ни было - несколько элементов или несколько миллионов элементов. Работа со списками принадлежит к числу самых выдающихся возможностей Python, доступных для начинающего программиста. Операции со списками связывают воедино многие важные концепции в программировании.

Что такое список?

Список представляет собой набор элементов, следующих в определенном порядке. Вы можете создать список для хранения букв алфавита, цифр от 0 до 9 или имен всех членов вашей семьи. В список можно поместить любую информацию, причем данные в списке даже не обязаны быть как-то связаны друг с другом. Так как список обычно содержит более одного элемента, рекомендуется присваивать спискам имена во множественном числе: letters, digits, names и так далее.

В языке Python список обозначается квадратными скобками [], а отдельные элементы списка разделяются запятыми. Простой пример списка с фруктами:

>>> fruits = ["яблоко", "груша", "апельсин", "киви"]
>>> print(fruits)

Если вы вызовете функцию print(), Python выведет перечисление элементов списка в квадратных скобках

['яблоко', 'груша', 'апельсин', 'киви']

Разберемся, как обратиться к отдельным элементам в списке.

Обращение к элементам списка

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

Например, первый фрукт выводится следующим образом

>>> print(fruits[0])
яблоко

Когда мы запрашиваем один элемент из списка, Python возвращает только этот элемент без квадратных скобок или кавычек

яблоко

Индексы начинаются с 0, а не с 1

Python считает, что первый элемент списка находится в позиции 0, а не в позиции 1. Этот принцип встречается в большинстве языков программирования и объясняется особенностями низкоуровневой реализации операций со списками. Если вы получаете неожиданные результаты, определите, не допустили ли вы простую ошибку "смещения на 1".

Второму элементу списка соответствует индекс 1. В этой простой схеме индекс любого элемента вычисляется уменьшением на 1 его позиции в списке. Например, чтобы обратиться к четвертому элементу списка, следует запросить элемент с индексом 3.

В следующем примере выводятся названия фруктов с индексами 1 и 3

>>> print(fruits[1])
>>> print(fruits[3])

При этом выводятся второй и четвертый элементы списка

груша
киви

В Python также существует специальный синтаксис для обращения к последнему элементу списка. Если запросить элемент с индексом -1, Python всегда возвращает последний элемент в списке:

>>> print(fruits[-1])
киви

Этот синтаксис весьма полезен, потому что при работу со списками часто требуется обратиться к последним элементам, не зная точного количества элементов в списке. Синтаксис также распространяется на другие отрицательные значения индексов. Индекс -2 возвращает второй элемент от конца списка, индекс -3 - третий элемент от конца и так далее.

Изменение, добавление и удаление элементов

Как правило, вы будете создавать динамические списки; это означает, что во время выполнения программы в созданном вами списке будут добавляться и удаляться элементы.

Например, вы можете создать игру, в которой игрок должен стрелять по кораблям космических захватчиков. Исходный набор кораблей сохраняется в списке; каждый раз, когда вы сбиваете корабль, он удаляется из списка. Каждый раз, когда на экране появляется новый враг, он включается в список. Длина списка кораблей будет уменьшаться и увеличиваться по ходу игры.

Изменение элементов в списке

Синтаксис изменения элемента напоминает синтаксис обращения к элементу списка. Чтобы изменить элемент, укажите имя списка и индекс изменяемого элемента в квадратных скобках; далее задайте новое значение, которое должно быть присвоено элементу.

Допустим, имеется список фамилий студентов и первым элементом списка хранится строка "Иванов". Как изменить значение первого элемента?

>>> students = ["Иванов","Петров","Сидоров"]
>>> print(students)
['Иванов', 'Петров', 'Сидоров']

>>> students[0] = "Серегин"
>>> print(students)
['Серегин', 'Петров', 'Сидоров']

В строке 1 определяется исходный список, в котором первый элемент содержит строку "Иванов". В строке 5 значение первого элемента заменяется строкой "Серегин". Из вывода видно, что первый элемент действительно изменился, тогда как остальные элементы списка сохранили прежние значения:

['Иванов', 'Петров', 'Сидоров']
['Серегин', 'Петров', 'Сидоров']

Изменить можно значение любого элемента в списке, не только первого.

Добавление элементов в список

Новые элементы могут добавляться в списки по разным причинам: например, для появления на экране новых космических кораблей, включения новых данных в визуализацию или добавления новых зарегистрированных пользователей на созданный вами сайт. Python предоставляет несколько способов добавления новых данных в существующие списки.

Присоединение элементов в конец списка

Простейший способ добавления новых элементов в список - присоединение элементов в конец списка. Используя список из предыдущего примера, добавим нового студента в конец списка

>>> students = ["Иванов","Петров","Сидоров"]
>>> students.append("Васин")

>>> print(students)
['Иванов', 'Петров', 'Сидоров', 'Васин']

Функция append() в строке 2 присоединяет строку "Васин" в конец списка, другие элементы в списке остаются неизменными.

Функция append() упрощает динамическое построение списков. Например, вы можете начать с пустого списка и добавлять в него элементы серией функций append().

>>> students = []
>>> students.append("Петров")
>>> students.append("Николаев")
>>> students.append("Юлин")

>>> print(students)
['Петров', 'Николаев', 'Юлин']

Такой способ построения списков встречается очень часто, потому что данные, которые пользователь захочет сохранить в программе, часто становятся известными только после запуска программы. Чтобы пользователь мог управлять содержимым списка. начните с определения пустого списка, а затем присоединяйте к нему каждое новое значение.

Вставка элементов в список

Функция insert() позволяет добавить новый элемент в произвольную позицию списка. Для этого следует указать индекс и значение нового элемента.

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> students.insert(0, "Aфонин")

>>> print(students)
['Aфонин', 'Иванов', 'Петров', 'Сидоров']

В этом примере в строке 2 значение "Афонин" вставляется в начало списка. Функция insert() выделяет свободное место в позиции 0 и сохраняет в нем значение "Афонин". Все остальные значения списка при этом сдвигаются на одну позицию вправо.

Удаление элементов из списка

Нередко возникает необходимость в удалении одного или нескольких элементов из списка.

Например, когда игрок сбивает корабль пришельца, этот корабль стоит удалить из списка активных врагов. Или когда пользователь решает удалить свою учетную запись в созданном вами веб-приложении, этот пользователь должен быть удален из списка активных пользователей.

Элементы удаляются из списка по позиции или по значению.

Удаление элемента с использованием команды del

Если вам неизвестна позиция элемента, который должен быть удален из списка, воспользуйтесь командой del.

>>> print(students)
['Aфонин', 'Иванов', 'Петров', 'Сидоров']
>>> del students[0]

>>> print(students)
['Иванов', 'Петров', 'Сидоров']

Команда del позволяет удалить элемент из любой позиции списка, если вам известен его индекс. Например, вот как из списка удаляется второй элемент

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> del students[1]

>>> print(students)
['Иванов', 'Сидоров']

В обоих примерах значение, удаленное из списка после использования команды del, становится недоступным.

Удаление элемента с использованием функции pop()

Иногда значение, удаляемое из списка, должно как-то использоваться.

Допустим, вы хотите получить координаты x и y только что сбитого корабля пришельцев, чтобы изобразить взрыв в этой позиции. В веб-приложении пользователь, удаленный из списка активных участников, может быть добавлен в список неактивных и так далее.

Функция pop() удаляет последний элемент из списка, но позволяет работать с ним после удаления.

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> expelled = students.pop()

>>> print(students)
['Иванов', 'Петров']

>>> print(expelled)
Сидоров

В строке 2 значение извлекается из списка и сохраняется в переменной с именем expelled. Вывод измененного списка в строке 4 показывает, что значение было удалено из списка. Затем мы выводим извлеченное значение в строке 7, демонстрируя, что удаленное значение остается доступным в программе.

Извлечение элементов из произвольной позиции списка

Функция pop() может использоваться для удаления элемента в произвольной позиции списка; для этого следует указать индекс удаляемого элемента как аргумент функции pop()

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> expelled = students.pop(1)

>>> print(students)
['Иванов', 'Сидоров']

>>> print(expelled)
Петров

Помните, что после каждого вызова pop() элемент, с которым вы работаете, уже не находится в списке.

Если вы не уверены в том, какой из двух способов выбрать, команду del или функцию pop() - если вы собираетесь просто удалить элемент из списка, никак не используя его, выбирайте команду del; если же вы намерены использовать элемент после удаления из списка, выбирайте функцию pop().

Удаление элементов по значению

Иногда позиция удаляемого элемента неизвестна. Если вы знаете только значение элемента, используйте функцию remove(). В качестве аргумента функции указывается значение, которое требуется удалить

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> students.remove("Петров")

>>> print(students)
['Иванов', 'Сидоров']

Ошибки индексирования при работе со списками

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

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> print(students[3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Python пытается вернуть элемент с индексом 3. Однако при поиске по списку ни один элемент не обладает индексом 3. Из-за смещения индексов на 1 эта ошибка весьма распространена. Люди думают, что третьим элементом является элемент с индексом 3, потому что они начинают отсчет с 1. Но для Python третьим является элемент с индексом 2, потому что индексирование начинается с 0.

Ошибка индексирования означает, что указанный индекс для данного списка является некорректным.

Помните, что для обращения к последнему элементу в списке используется индекс -1. Этот способ работает всегда, даже если размер списка изменился с момента последнего обращения к нему

>>> students = ["Иванов", "Петров", "Сидоров"]
>>> print(students[-1])
Сидоров

Этот синтаксис порождает ошибку только в одном случае - при попытке получить последний элемент пустого списка

>>> students = []
>>> print(students[-1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Список (массив) - это индексированная совокупность переменных.

Список в Python - это встроенный тип данных, представляющий собой одну из разновидностей структур данных. Структуру данных можно представить как сложную единицу, объединяющую в себе группу более простых. Каждая разновидность структур данных имеет свои особенности. Список - это изменяемая последовательность произвольных элементов.

В подавляющем большинстве других языков программирования есть широко используемый тип данных как массив. В Python такого встроенного типа нет. Однако списки - это по своей сути массивы за одним исключением. Составляющие массив элементы должны принадлежать одному типу данных, для списков в python такого ограничения нет.

Например, массив должен содержать только целые числа или только вещественные числа или только строки. Список также может содержать элементы только одного типа, что делает его внешне неотличимым от массива. Но вполне допустимо, чтобы в одном списке содержались как числа, так и строки, а также что-нибудь еще.

Создавать списки разными способами. Создадим его простым перечислением элементов

# Список содержит элементы одного типа
a = [12, 20, 30]

# Список может содержать элементы разных типов
b = [10, 2.85, "текст"]

Итак, у нас имеется список, присвоенный переменной a. В Python список определяется квадратными скобками. Он содержит четыре элемента. Если в программе нам понадобится весь этот список, мы получим доступ к нему, указав всего лишь одну переменную a.

Элементы в списке упорядочены, имеет значение в каком порядке они расположены. Каждый элемент имеет свой индекс, или номер. Индексация начинается с нуля. В данном случае число 12 имеет индекс 0, строка "текст" индекс 2. Чтобы извлечь конкретный элемент, надо после имени переменной указать в квадратных скобках индекс необходимого элемента

>>> a = [1,2,3,4,5]
>>> a[0]
1
>>> a[3]
4

В Python существует также индексация с конца. Она начинается с -1:

>>> a = [1,2,3,4,5]
>>> a[-1]
5
>>> a[-3]
3

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

>>> a
[1, 2, 3, 4, 5]
>>> a[2] = 100
>>> a
[1, 2, 100, 4, 5]

Добавлять и удалять лучше с помощью специальных встроенных функций списка

>>> a = [1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4, 5]

>>> a.append(100) # Добавляем элемент в конец списка
>>> a
[1, 2, 3, 4, 5, 100]

>>> a.insert(1,200) # Добавляем элемент в указанную позицию
>>> a
[1, 200, 2, 3, 4, 5, 100]

>>> a.remove (1) # Извлекаем указанный элемент из списка
# Обратите внимание, что мы указываем именно значение элемента, а не его индекс
>>> a
[200, 2, 3, 4, 5, 100]

>>> a.pop() # Извлекаем последний добавленный элемент
100
>>> a
[200, 2, 3, 4, 5]

>>> a.pop(4) # Извлекаем элемент с указанным индексом
# Обратите внимание, что мы указываем не значение элемента, а индекс в списке
5
>>> a
[200, 2, 3, 4]

Списки можно объединять с помощью оператора сложения. Новый список будет содержать в себе последовательное содержимое двух списков

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]

Last updated