Python списки: Полный обзор

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

Содержание

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

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

Давайте рассмотрим некоторые ключевые свойства списков в Python:

Списки Python — это…Описание

Упорядоченный

Python-списки - это не просто набор объектов, а упорядоченный набор объектов. Это означает, что заданный порядок имеет значение. Пока порядок явно не изменен, он остается тем же.

Индексируемый

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

Изменяемый

Мы можем изменять списки, применяя различные функции или методы к спискам. Это может включать сортировку значений по-разному (например, от меньшего к большему) или фильтрацию значений списка на основе условия.

Разнородный

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

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

Создание списков в Python

Давайте теперь посмотрим, как мы можем создавать списки в Python. Чтобы создать пустой список, у вас есть два разных варианта:

  1. Использование функции list()

  2. Using empty square brackets, []

Давайте посмотрим, как это выглядит:

# Создание пустого списка в Python
empty_list1 = list()
empty_list2 = []

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

Создадим непустой список:

# Создание непустого списка
list1 = ['Nik', 33, 'Toronto']

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

# Создание непустого списка с красивым форматированием
list1 = [
    'Nik', 
    33, 
    'Toronto'
]

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

Проверка типа списка

Если вы не уверены в типе вашего объекта, вы можете использовать встроенную функцию type(), чтобы проверить тип объекта. Давайте передадим одну из наших списков в функцию и посмотрим, что она вернёт:

# Проверка типа списка
list1 = list()
print(type(list1))

Возвращает следующее: <class 'list'>

В следующем разделе вы узнаете, как получать доступ к данным в списках Python.

Доступ к данным в списках Python

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

Индексы списков Python начинаются с 0, что означает, что они стартуют с значения 0 и заканчиваются значением длины списка минус 1. Также индексация может идти с конца. Последний элемент имеет индекс -1 и продолжается до отрицательного значения длины списка.

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

# Загрузка примера списка
letters = ['a', 'b', 'c', 'd', 'e', 'f']

Хотя кажется противоинтуитивным, что отрицательные индексы должны начинаться с -1, стоит представить индексы как границы между различными элементами списка.

Использование индекса списка для доступа к элементу

Посмотрим, как мы можем использовать индекс, как положительный, так и отрицательный, чтобы получить доступ к элементам списка. Помните, что первый элемент будет иметь индекс 0, а последний элемент будет иметь отрицательный индекс -1

Давайте посмотрим, как мы можем использовать наш список для доступа к первому и последнему элементам в наших списках:

# Доступ к элементам списка с использованием индексации
letters = ['a', 'b', 'c', 'd', 'e', 'f']

first_item = letters[0]
last_item = letters[-1]

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

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

letters = ['a', 'b', 'c', 'd', 'e', 'f']

print(letters[6])

Проверьте решение ниже

IndexError: list index out of range

Хотя интуитивно мы можем думать, что это вернет последний элемент 'f', Python на самом деле вызывает IndexError. Это происходит потому, что списки в Python индексируются с нуля. Технически, последний элемент в нашем списке находится на позиции индекса 5. Это можно вычислить, сначала найдя длину списка (6) и вычитая 1 из нее.

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

Нарезка списков Python для доступа к нескольким элементам

Давайте посмотрим, как можно получить доступ ко второму, третьему и четвертому элементам в нашем списке: Списки Python также можно разрезать, что означает, что мы можем легко получить доступ к части списка. Мы указываем начальную и конечную позиции индексов внутри квадратных скобок, разделенных двоеточием.

# Вырезание среза списка в Python - так же просто, как нарезать пирог!
letters = ['a', 'b', 'c', 'd', 'e', 'f']

slice = letters[1:4]
print(slice)

# Вывод: ['b', 'c', 'd']

Вот пара вещей, на которые стоит обратить внимание:

  • Возвращаемый срез также является списком

  • Параметр окончания является не включающим, то есть он включает все элементы до, но не включая элемент с этим индексом.

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

Проверьте своё понимание: Выполните упражнения ниже, чтобы проверить свои знания о том, какие элементы будут включены в срез. Помните, что наш список выглядит так: letters = ['a', 'b', 'c', 'd', 'e', 'f']

['a', 'b', 'c', 'd', 'e', 'f']

['e', 'f']

['c', 'd', 'e']

['b', 'c', 'd']

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

Изменение Элементов Списка в Python

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

Давайте посмотрим, как мы можем изменить первый элемент нашего предыдущего списка:

# Изменение первого элемента в списке Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']

letters[0] = 'g'
print(letters)

# Вывод: ['g', 'b', 'c', 'd', 'e', 'f']

Мы можем увидеть, как легко было изменить элемент списка.

Аналогично, мы также можем изменить срез списка, передав другой список элементов:

# Изменение нескольких элементов в списке
letters = ['a', 'b', 'c', 'd', 'e', 'f']

# Замена первых двух элементов новыми значениями
letters[0:2] = ['g', 'h']
print(letters)

# Вывод: ['g', 'h', 'c', 'd', 'e', 'f']

Что, по вашему мнению, произойдет, когда мы попытаемся написать следующий код?

letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters[6] = 'g'

Это приведет к следующему:

IndexError: list assignment index out of range

Python вызывает IndexError, так как в нашем списке нет позиции 6. Хотя это может показаться интуитивным способом добавления элементов в список, на самом деле Python не может обработать это.

В следующем разделе вы узнаете, как проверить наличие элемента в списке.

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

Много раз вам просто нужно узнать, существует ли элемент в списке. Для этого мы можем использовать ключевое слово in. Буквально, это ключевое слово оценивает, существует ли элемент в списке или нет. Это одно из больших преимуществ Python – его акцент на читаемость.

Использование этого ключевого слова вернет логическое значение:

  1. Если элемент существует, выражение будет оценено как True

  2. Если элемент не существует, выражение будет оцениваться как False

Давайте проверим, существует ли строка 'a' в нашем списке:

# Проверка наличия элемента в списке
letters = ['a', 'b', 'c', 'd', 'e', 'f']
print('a' in letters)

# Вывод: True

Здесь мы видим, что наш код вернул True, поскольку строка существует в нашем списке. Аналогично, мы можем подтвердить, что строка 'datagy' не существует в нашем списке:

# Проверка отсутствия элемента в списке Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']
print('datagy' in letters)

# Вывод: False

В следующем разделе вы узнаете некоторые способы добавления элементов в список Python.

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

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

В Python есть метод списка .append(), который позволяет добавлять элементы в список.

Давайте посмотрим, как мы можем добавить строку 'g' в наш предыдущий список:

# Добавление элементов в конец списка Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters.append('g')

print(letters)

# Вывод: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

Важно отметить, что метод .append() изменяет список на месте. Это означает, что, так как наш список изменяемый, нам не нужно присваивать его новой переменной для использования.

Мы можем даже добавить несколько элементов в список! Давайте посмотрим, что произойдет, когда мы используем метод .append() для добавления списка элементов в другой список:

# Добавление нескольких элементов в конец списка Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters.append(['g', 'h'])

print(letters)

# Вывод: ['a', 'b', 'c', 'd', 'e', 'f', ['g', 'h']]

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

Чтобы добавить несколько элементов одновременно в список Python, мы можем использовать метод .extend(). Этот метод добавляет все элементы итерируемого объекта (например, списка) в конец другого списка. Давайте повторим наш предыдущий пример с этим новым методом!

# Добавление нескольких элементов в конец списка Python с помощью .extend()
letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters.extend(['g', 'h'])

print(letters)

# Вывод: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

Это сработало гораздо лучше и дало нам результат, на который мы надеялись!

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

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

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

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

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

Метод .pop() принимает один аргумент — индекс элемента, который вы хотите удалить. Более того, он возвращает этот элемент, что может быть весьма удобно, если вы хотите воспользоваться удаленным объектом. Это особенно полезно при создании игр.

Давайте рассмотрим, как использовать этот метод для удаления второго элемента в нашем списке:

# Удаление второго элемента из списка с помощью .pop()
letters = ['a', 'b', 'c', 'd', 'e', 'f']
dropped_letter = letters.pop(1)

print('Dropped letter: '+dropped_letter)
print('letters = ', letters)

# Вывод:
# Dropped letter: b
# letters =  ['a', 'c', 'd', 'e', 'f']

Мы видим, что с помощью метода .pop() можно удалить элемент из списка по его позиции.

Удаление элемента из списка Python по его значению

Аналогично, мы можем удалить элемент из списка в Python по его значению. Для этого можно использовать метод .remove(). Как и метод .pop(), этот метод принимает только один аргумент: значение, которое мы хотим удалить. В отличие от метода .pop(), этот метод не возвращает ничего.

Посмотрим, как мы можем использовать Python для удаления строки 'c' из нашего списка:

# Удаление элемента из списка с помощью .remove()
letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters.remove('c')

print(letters)

# Вывод: ['a', 'b', 'd', 'e', 'f']

Здесь мы видим, что наш список был успешно изменен, и строка 'c' была удалена. Посмотрите на код ниже и попробуйте угадать, что произойдет:

letters = ['a', 'b', 'c', 'd', 'e', 'f']
letters.remove('g')

ответ

ValueError: list.remove(x): x not in list

Если элемент отсутствует в нашем списке и мы пытаемся его удалить, Python вызовет ValueError. Это приведет к завершению нашей программы и все последующее кодирование не будет выполнено.

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

Итерация по спискам в Python

Может случиться так, что вам нужно будет повторять (или проходить) элементы списка. Python делает это очень легко для написания (и чтения). Мы можем просто попросить Python сделать что-то "для" каждого элемента "в" нашем списке. Скажем, мы хотим распечатать каждую строку в нашем списке letters, мы можем просто написать следующее:

# Итерация по списку Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']

for letter in letters:
    print(letter)

# Вывод:
# a
# b
# c
# d
# e
# f

Это было легко! Одно из замечательных качеств Python заключается в том, насколько он похож на английский язык. Сразу понятно, что мы хотим сделать.

Следует отметить, что использование итератора letter является полностью необязательным. Мы можем назвать его как угодно. Например, написание кода ниже даст тот же результат:

# Итерация по списку Python
letters = ['a', 'b', 'c', 'd', 'e', 'f']

for gobbledygook in letters:
    print(gobbledygook)

# Вывод:
# a
# b
# c
# d
# e
# f

Что-то, что может показаться незначительным при написании кода, это выбор имен переменных. Важно стремиться к читаемости вашего кода. Поэтому выбор letter вероятно имеет больше смысла, чем goobledygook!

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

Генераторы списков в Python

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

Изображение ниже показывает синтаксис работы генератора списков в Python.

Мы создаем новый список и затем оцениваем выражение для каждого элемента в другом итерируемом элементе.

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

Давайте посмотрим, как мы можем сделать это с помощью list comprehension:

# Простой пример генератора списка
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [number ** 2 for number in numbers]

print(squares)

# Вывод: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

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

В следующем разделе вы узнаете больше о списках списков в Python.

Списки списков Python

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

Можно думать о списках списков как о матрицах для хранения данных. Поскольку сами списки упорядочены, это может быть логичным способом хранения данных. Например, можно использовать каждый вложенный список для хранения информации о различных клиентах, а внешний список для хранения всех остальных списков. Это избавляет вас от необходимости инициализировать новые переменные для каждого списка.

Посмотрим, как это может выглядеть:

# Простой список списков
customers = [
    ['Nik', 32, 'Toronto'],
    ['Kate', 33, 'Paris'],
    ['Nate', 27, 'Nashville'],
]

Теперь каждый элемент в нашем списке customers на самом деле является списком. Поэтому, если мы хотим получить первый элемент, используя индекс 0, мы вернем на самом деле первый список.

# Доступ к элементам в списке списков
customers = [
    ['Nik', 32, 'Toronto'],
    ['Kate', 33, 'Paris'],
    ['Nate', 27, 'Nashville'],
]

print(customers[0])

# Вывод: ['Nik', 32, 'Toronto']

Если мы хотим получить доступ к первому элементу в нашем первом списке, мы можем просто использовать индексные операторы.

# Доступ к первому элементу в первом вложенном списке
customers = [
    ['Nik', 32, 'Toronto'],
    ['Kate', 33, 'Paris'],
    ['Nate', 27, 'Nashville'],
]

print(customers[0][0])

# Вывод: Nik

Списки списков — это один из способов хранения данных. Однако они не лучший способ для хранения больших объемов табличных данных. Для этого вам стоит рассмотреть использование Numpy и Pandas, о которых вы узнаете в будущих уроках.

Заключение и Резюме

Фух! Это был длинный учебник! Вы узнали о структуре данных списка в Python и ее различных атрибутах. Затем вы узнали, как работать со списками, например, проверять членство, добавлять и удалять элементы, и доступ к данным внутри списков.

Ниже вы найдете краткий обзор списков Python:

  • Списки в Python являются гетерогенными, изменяемыми, упорядоченными структурами данных

  • Они могут быть созданы с использованием функции list() или квадратных скобок []

  • Поскольку они упорядочены и индексированы, вы можете получить доступ к отдельным элементам, используя метод индексирования [index], или умножать элементы, используя срезы

  • Вы можете добавлять элементы с помощью методов .append() и .extend(), а удалять элементы с помощью методов .remove() и .pop()

  • Вы можете перебирать списки, используя простые циклы for, и вы можете использовать списковые включения для создания списков в краткой форме

  • Наконец, вы можете использовать списки списков для хранения более сложных структур данных, таких как те, которые предназначены для представления в табличной форме.

Далее вы узнаете, как использовать условия и условные выражения в Python для дальнейшей модификации ваших программ на Python!

Дополнительные ресурсы

Посмотрите эти связанные учебные пособия, чтобы узнать о смежных темах:

  • Python: выберите случайный элемент из списка

  • 4 способа очистить список Python

  • Python: разделить список на n фрагментов (4 способа)

  • Python IndexError: объяснение ошибки индекса списка вне диапазона

Last updated