Понимание списков в Python 3
Введение
Список — это структура данных в Python, представляющая собой изменяемую или изменяемую упорядоченную последовательность элементов. Каждый элемент или значение, находящееся внутри списка, называется элементом. Точно так же, как строки определяются как символы в кавычках, списки определяются с помощью значений, заключенных в квадратные скобки [ ]
.
Списки отлично подходят для работы со многими связанными значениями. Они позволяют хранить вместе данные, которые принадлежат друг другу, сокращать код и выполнять одни и те же методы и операции над несколькими значениями одновременно.
Размышляя о списках Python и других структурах данных, которые являются типами коллекций, полезно учитывать все различные коллекции, которые есть на вашем компьютере: набор файлов, списки воспроизведения песен, закладки браузера, электронные письма, коллекцию видео. вы можете получить доступ к потоковому сервису и многое другое.
Предпосылки
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.).
Списки строк
Для начала создадим список, содержащий элементы строкового типа данных:
Информация: Чтобы следовать примеру кода в этом руководстве, откройте интерактивную оболочку Python в вашей локальной системе, выполнив команду python3
. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>
.
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']
Когда мы распечатываем список, вывод отвечает точно так же, как список, который мы создали:
print(sea_creatures)
Output['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']
Как упорядоченная последовательность элементов, каждый элемент в списке может вызываться индивидуально посредством индексации. Списки представляют собой составной тип данных, состоящий из более мелких частей, и они очень гибкие, поскольку в них можно добавлять, удалять и изменять значения. Когда вам нужно сохранить много значений или выполнить итерацию по значениям, и вы хотите иметь возможность легко изменять эти значения, вы, вероятно, захотите работать со списками данных.
В этом уроке мы рассмотрим некоторые способы работы со списками в Python.
Списки индексации
Каждому элементу в списке соответствует порядковый номер, представляющий собой целочисленное значение, начинающееся с порядкового номера 0
.
Для списка sea_creatures
разбивка индекса выглядит следующим образом:
‘shark’ | ‘cuttlefish’ | ‘squid’ | ‘mantis shrimp’ | ‘anemone’ |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
Первый элемент, строка shark
, начинается с индекса 0
, а список заканчивается с индексом 4
элементом анемон
.
Поскольку каждый элемент в списке Python имеет соответствующий порядковый номер, мы можем обращаться к спискам и манипулировать ими так же, как и с другими последовательными типами данных.
Теперь мы можем вызвать дискретный элемент списка, обратившись к его порядковому номеру:
print(sea_creatures[1])
Outputcuttlefish
Номера индексов для этого списка находятся в диапазоне от 0
-4
, как показано в таблице выше. Таким образом, чтобы вызвать любой из элементов по отдельности, мы будем обращаться к порядковым номерам следующим образом:
sea_creatures[0] = 'shark'
sea_creatures[1] = 'cuttlefish'
sea_creatures[2] = 'squid'
sea_creatures[3] = 'mantis shrimp'
sea_creatures[4] = 'anemone'
Если мы вызовем список sea_creatures
с любым порядковым номером, который больше 4, он выйдет за пределы допустимого диапазона, поскольку он недействителен:
print(sea_creatures[18])
OutputIndexError: list index out of range
В дополнение к положительным порядковым номерам мы также можем получить доступ к элементам из списка с отрицательным порядковым номером, считая в обратном порядке от конца списка, начиная с -1
. Это особенно полезно, если у нас есть длинный список, и мы хотим выделить элемент ближе к концу списка.
Для того же списка sea_creatures
разбивка отрицательного индекса выглядит следующим образом:
‘shark’ | ‘cuttlefish’ | ‘squid’ | ‘mantis shrimp’ | ‘anemone’ |
---|---|---|---|---|
-5 | -4 | -3 | -2 | -1 |
Итак, если мы хотим распечатать элемент squid
, используя его отрицательный порядковый номер, мы можем сделать это следующим образом:
print(sea_creatures[-3])
Outputsquid
Мы можем объединить строковые элементы в списке с другими строками, используя оператор +
:
print('Sammy is a ' + sea_creatures[0])
OutputSammy is a shark
Нам удалось соединить элемент строки с порядковым номером 0
со строкой Sammy is a
. Мы также можем использовать оператор +
для объединения 2 или более списков вместе.
С номерами индексов, которые соответствуют элементам в списке, мы можем получить доступ к каждому элементу списка дискретно и работать с этими элементами.
Изменение элементов в списках
Мы можем использовать индексацию для изменения элементов в списке, установив номер индекса, равный другому значению. Это дает нам больший контроль над списками, поскольку мы можем изменять и обновлять содержащиеся в них элементы.
Если мы хотим изменить строковое значение элемента с индексом 1
с cuttlefish
на octopus
, мы можем сделать это следующим образом:
sea_creatures[1] = 'octopus'
Теперь, когда мы печатаем sea_creatures
, список будет другим:
print(sea_creatures)
Output['shark', 'octopus', 'squid', 'mantis shrimp', 'anemone']
Мы также можем изменить значение элемента, используя вместо этого отрицательное число индекса:
sea_creatures[-3] = 'blobfish'
print(sea_creatures)
Output['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone']
Теперь blobfish
заменил squid
с отрицательным порядковым номером -3
(что соответствует положительному порядковому номеру 2
). ).
Возможность изменять элементы в списках дает нам возможность изменять и обновлять списки эффективным способом.
Списки нарезки
Мы также можем вызвать несколько элементов из списка. Допустим, мы хотим напечатать только средние элементы sea_creatures
, мы можем сделать это, создав срез. С помощью срезов мы можем вызывать несколько значений, создавая диапазон номеров индексов, разделенных двоеточием [x:y]
:
print(sea_creatures[1:4])
Output['octopus', 'blobfish', 'mantis shrimp']
При создании фрагмента, как в [1:4]
, первый номер индекса — это место, где начинается фрагмент (включительно), а второй номер индекса — это место, где фрагмент заканчивается (исключая), поэтому в нашем примере выше элементы в позиции 1
, 2
и 3
— это элементы, которые распечатываются.
Если мы хотим включить любой конец списка, мы можем опустить одно из чисел в синтаксисе list[x:y]
. Например, если мы хотим напечатать первые 3 элемента списка sea_creatures
— это будут акула
, осьминог
, blobfish
— мы можем сделать это, набрав:
print(sea_creatures[:3])
Output['shark', 'octopus', 'blobfish']
Это напечатало начало списка, остановившись прямо перед индексом 3
.
Чтобы включить все элементы в конец списка, мы бы изменили синтаксис:
print(sea_creatures[2:])
Output['blobfish', 'mantis shrimp', 'anemone']
Мы также можем использовать отрицательные порядковые номера при нарезке списков, подобно положительным порядковым номерам:
print(sea_creatures[-4:-2])
print(sea_creatures[-3:])
Output['octopus', 'blobfish']
['blobfish', 'mantis shrimp', 'anemone']
Последний параметр, который мы можем использовать при нарезке, называется шагом и указывает, сколько элементов нужно продвинуть вперед после того, как первый элемент будет извлечен из списка. До сих пор мы опускали параметр шага, и Python по умолчанию использует шаг, равный 1, так что извлекается каждый элемент между двумя номерами индекса.
Синтаксис этой конструкции следующий: list[x:y:z]
, где z
относится к шагу. Давайте составим список большего размера, затем нарежем его и присвоим шагу значение 2:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print(numbers[1:11:2])
Output[1, 3, 5, 7, 9]
Наша конструкция numbers[1:11:2]
выводит значения между порядковыми номерами, включая 1
и исключая 11
, затем значение шага 2
говорит программе распечатать только каждый второй элемент.
Мы можем опустить первые два параметра и использовать только шаг в качестве параметра с синтаксисом list[::z]
:
print(numbers[::3])
Output[0, 3, 6, 9, 12]
При печати списка numbers
с шагом, установленным на 3
, печатается только каждый третий элемент:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Нарезка списков как с положительными, так и с отрицательными порядковыми номерами и указанием шага дает нам возможность управлять списками и получать результат, которого мы пытаемся достичь.
Изменение списков с помощью операторов
Операторы могут использоваться для внесения изменений в списки. Мы рассмотрим использование операторов +
и *
и их составных форм +=
и *=
.
Оператор +
можно использовать для объединения двух или более списков вместе:
sea_creatures = ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone']
oceans = ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
print(sea_creatures + oceans)
Output['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
Поскольку оператор +
может выполнять конкатенацию, его можно использовать для добавления элемента (или нескольких) в виде списка в конец другого списка. Не забудьте поместить элемент в квадратные скобки:
sea_creatures = sea_creatures + ['yeti crab']
print (sea_creatures)
Output['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
Оператор *
может использоваться для умножения списков. Возможно, вам нужно сделать копии всех файлов в каталоге на сервер или поделиться плейлистом с друзьями — в этих случаях вам нужно будет размножить наборы данных.
Умножим список sea_creatures
на 2 и список oceans
на 3:
print(sea_creatures * 2)
print(oceans * 3)
Output['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
Используя оператор *
, мы можем реплицировать наши списки указанное количество раз.
Мы также можем использовать составные формы операторов +
и *
с оператором присваивания =
. Составные операторы +=
и *=
можно использовать для быстрого и автоматизированного заполнения списков. Вы можете использовать эти операторы для заполнения списков заполнителями, которые вы можете изменить позже, например, с помощью пользовательского ввода.
Давайте добавим элемент в виде списка в список sea_creatures
. Этот элемент будет выступать в качестве заполнителя, и мы хотели бы добавить этот элемент-заполнитель несколько раз. Для этого мы будем использовать оператор +=
с циклом for.
for x in range(1,4):
sea_creatures += ['fish']
print(sea_creatures)
Output['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish']
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish']
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish', 'fish']
Для каждой итерации цикла for к исходному списку sea_creatures
добавляется дополнительный элемент списка fish
.
Оператор *=
ведет себя аналогичным образом:
sharks = ['shark']
for x in range(1,4):
sharks *= 2
print(sharks)
Output['shark', 'shark']
['shark', 'shark', 'shark', 'shark']
['shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark']
Операторы +
и *
можно использовать для объединения списков и умножения списков. Составные операторы +=
и *=
могут объединять списки и умножать списки и передавать новое удостоверение исходному списку.
Удаление элемента из списка
Элементы можно удалять из списков с помощью оператора del
. Это удалит значение с номером индекса, который вы укажете в списке.
Из списка sea_creatures
удалим элемент octopus
. Этот элемент находится в позиции индекса 1
. Чтобы удалить элемент, мы будем использовать оператор del
, затем вызовем переменную списка и порядковый номер этого элемента:
sea_creatures =['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
del sea_creatures[1]
print(sea_creatures)
Output['shark', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
Теперь элемент в индексной позиции 1
, строка octopus
, больше не находится в нашем списке sea_creatures
.
Мы также можем указать диапазон с помощью инструкции del
. Допустим, мы хотим удалить не только элемент осьминог
, но также рыба-капля
и креветка-богомол
. Мы можем вызвать диапазон в sea_creatures
с оператором del
, чтобы выполнить это:
sea_creatures =['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
del sea_creatures[1:4]
print(sea_creatures)
Output['shark', 'anemone', 'yeti crab']
Используя диапазон с оператором del
, мы смогли удалить элементы между порядковым номером 1
(включительно) и порядковым номером 4
(эксклюзивно), оставив нам список из 3 элементов после удаления 3 элементов.
Оператор del
позволяет нам удалять определенные элементы из типа данных списка.
Создание списка с элементами списка
Списки могут быть определены с помощью элементов, состоящих из списков, причем каждый список в квадратных скобках заключен в большие скобки родительского списка:
sea_names = [['shark', 'octopus', 'squid', 'mantis shrimp'],['Sammy', 'Jesse', 'Drew', 'Jamie']]
Эти списки внутри списков называются вложенными списками.
Чтобы получить доступ к элементу в этом списке, нам придется использовать несколько индексов:
print(sea_names[1][0])
print(sea_names[0][0])
OutputSammy
shark
Первый список, поскольку он равен элементу, будет иметь порядковый номер 0, который будет первым числом в построении, а второй список будет иметь порядковый номер 1. Внутри каждого внутреннего вложенного списка будет отдельные порядковые номера, которые мы будем называть вторым порядковым номером:
sea_names[0][0] = 'shark'
sea_names[0][1] = 'octopus'
sea_names[0][2] = 'squid'
sea_names[0][3] = 'mantis shrimp'
sea_names[1][0] = 'Sammy'
sea_names[1][1] = 'Jesse'
sea_names[1][2] = 'Drew'
sea_names[1][3] = 'Jamie'
При работе со списками списков важно помнить, что вам потребуется ссылаться более чем на один номер индекса, чтобы получить доступ к определенным элементам в соответствующем вложенном списке.
Заключение
Тип данных списка — это гибкий тип данных, который можно изменять в процессе выполнения вашей программы. В этом руководстве были рассмотрены основные функции списков, включая индексирование, нарезку, изменение и объединение списков.
Отсюда вы можете узнать больше о работе со списками в Python, прочитав учебник «Понимание типов данных».