Как составить список в питоне

#статьи

  • 30 ноя 2022

  • 0

Рассказали всё самое важное о списках для тех, кто только становится «змееустом».

Иллюстрация: Оля Ежак для Skillbox Media

Дмитрий Зверев

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.

Сегодня мы подробно поговорим о, пожалуй, самых важных объектах в Python — списках. Разберём, зачем они нужны, как их использовать и какие удобные функции есть для работы с ними.

Список (list) — это упорядоченный набор элементов, каждый из которых имеет свой номер, или индекс, позволяющий быстро получить к нему доступ. Нумерация элементов в списке начинается с 0: почему-то так сложилось в C, а C — это база. Теорий на этот счёт много — на «Хабре» даже вышло большое расследование 🙂

Так списки можно представить визуально
Иллюстрация: Оля Ежак для Skillbox Media

В одном списке одновременно могут лежать данные разных типов — например, и строки, и числа. А ещё в один список можно положить другой и ничего не сломается:

Мы положили в список число, строку и кота. Всё работает
Иллюстрация: Оля Ежак для Skillbox Media

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

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

Добавили новый элемент — мышь — и изменили первый элемент на 8
Иллюстрация: Оля Ежак для Skillbox Media

Когда мы создаём объект list, в памяти компьютера под него резервируется место. Нам не нужно переживать о том, сколько выделяется места и когда оно освобождается — Python всё сделает сам. Например, когда мы добавляем новые элементы, он выделяет память, а когда удаляем старые — освобождает.

Под капотом списков в Python лежит структура данных под названием «массив». У массива есть два важных свойства: под каждый элемент он резервирует одинаковое количество памяти, а все элементы следуют друг за другом, без «пробелов».

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

И тут есть небольшой трюк: списки в Python представляют собой массив ссылок. Да-да, решение очень элегантное — каждый элемент такого массива хранит не сами данные, а ссылку на их расположение в памяти компьютера!

Чтобы создать объект list, в Python используют квадратные скобки — []. Внутри них перечисляют элементы через запятую:

a = [1, 2, 3]

Мы создали список a и поместили в него три числа, которые разделили запятыми. Давайте выведем его с помощью функции print ():

print(a)

>>> [1, 2, 3]

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

Мы уже говорили, что списки могут хранить данные любого типа. В примере ниже объект b хранит: строку — cat, число — 123 и булево значение — True:

b = ['cat', 123, True]

print(b)

>>> ['cat', 123, True]

Также в Python можно создавать вложенные списки:

c = [1, 2, [3, 4]]

print(c)

>>> [1, 2, [3, 4]]

Мы получили объект, состоящий из двух чисел — 1 и 2, и вложенного list с двумя элементами — [3, 4].

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

Доступ к элементам списка получают по индексам, через квадратные скобки []:

a = [1, 2, 3]

print(a[1])

>>> 2

Мы обратились ко второму элементу и вывели его с помощью print ().

Здесь важно помнить две вещи:

  • у каждого элемента есть свой индекс;
  • индексы начинаются с 0.

Давайте ещё поиграем с индексами:

a = [1, 2, 3, 4]

a[0] # Обратится к 1
a[2] # Обратится к 3
a[3] # Обратится к 4
a[4] # Выведет ошибку

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

Кроме того, Python поддерживает обращение к нескольким элементам сразу — через интервал. Делается это с помощью двоеточия — :.

a = [1, 2, 3, 4]

a[0:2] # Получим [1, 2]

Двоеточие позволяет получить срез списка. Полная форма оператора выглядит так: начальный_индекс: конечный_индекс: шаг.

Здесь мы указываем, с какого индекса начинается «срез», на каком заканчивается и с каким шагом берутся элементы — по умолчанию 1. Единственный нюанс с конечным индексом: хоть мы и можем подумать, что закончим именно на нём, на самом деле Python остановится на элементе с индексом конечный_индекс — 1. Почему создатели языка решили так сделать? Кто их знает.

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

Усложним пример:

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

a[1:6:2] # Получим [2, 4]

Здесь мы шли по элементам с шагом 2. Начали с индекса 1 — это первое число внутри скобок, а закончили на индексе 6, не включая его. Двигались с шагом 2, то есть через один элемент, и получили — [2, 4].

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

Списки — это динамическая структура данных. А значит, мы можем менять их уже после создания.

Например, можно заменить один элемент на другой:

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

print(a)
 
>>> [1, 4, 3]

Мы обратились к элементу по индексу и заменили его на число 4. Всё прошло успешно, список изменился.

Но нужно быть осторожными, потому что может случиться такое:

a = [1, 2]
b = a
a[0] = 5

print(a)
print(b)

>> [5, 2]
>> [5, 2]

Сначала мы создали список a с двумя элементами — 1 и 2. Затем объявили переменную b и присвоили ей содержимое a. Потом заменили первый элемент в a и… удивились, что он заменился и в b.

Проблема в том, что a — это ссылка на область в памяти компьютера, где хранится первый элемент списка, а также на следующий его элемент. Вот как всё это устроено в памяти компьютера:

Когда мы присваиваем переменной список, на самом деле мы присваиваем ей ссылку на первый элемент списка
Иллюстрация: Оля Ежак для Skillbox Media

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

Поэтому, когда мы присвоили списку b список a, то на самом деле присвоили ему ссылку на первый элемент — по сути, сделав их одним списком.

Иногда полезно объединить два списка. Чтобы это сделать, используют оператор +:

a = [1, 2]
b = [3, 4]
с = a + b

print(с)

>>> [1, 2, 3, 4]

Мы создали два списка — a и b. Затем переприсвоили a новым списком, который стал объединением старого a и b.

Элементы списка можно присвоить отдельным переменным:

a = [1, 2, 3]
d1, d2, d3 = a

print(d1)
print(d2)
print(d3)

>>> 1
>>> 2
>>> 3

Здесь из списка a поочерёдно достаются элементы, начиная с индекса 0, и присваиваются переменным. И в отличие от присвоения одного списка другому, в этом случае Python создаст три отдельных целых числа, которые никак не будут связаны с элементами списка, и присвоит их трём переменным. Поэтому, если мы изменим, например, переменную d2, со списком a ничего не случится.

Мы можем перебирать элементы списка с помощью циклов for и while.

Так выглядит перебор через for:

animals = ['cat', 'dog', 'bat']
for animal in animals:
  print(animal)

>>> cat
>>> dog
>>> bat

Здесь мы перебираем каждый элемент списка и выводим их с помощью функции print ().

А вот так выглядит перебор через цикл while:

animals = ['cat', 'dog', 'bat']
i = 0
while i < len(animals):
  print(animals[i])
  i += 1

>>> cat
>>> dog
>>> bat

Этот перебор чуть сложнее, потому что мы используем дополнительную переменную i, чтобы обращаться к элементам списка. Также мы использовали встроенную функцию len (), чтобы узнать размер нашего списка. А ещё в условии цикла while мы указали знак «меньше» (<), потому что индексация элементов идёт до значения количество элементов списка — 1. Как и в прошлом примере, все элементы по очереди выводятся с помощью функции print ().

Python поддерживает сравнение списков. Два списка считаются равными, если они содержат одинаковые элементы. Функция возвращает булево значение — True или False:

a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)

>>> True

Получили, что списки равны.

В некоторых языках равенство ещё проверяется и по тому, ссылаются ли переменные на один и тот же объект. Обычно это делается через оператор ===. В Python это можно сделать через оператор is, который проверяет, имеют ли две переменные один и тот же адрес в памяти:

a = [1, 2, 3]
b = a
print(a is b)

>>> True

Получили, что две переменные ссылаются на один и тот же адрес в памяти.

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

Возвращает длину списка:

a = [5, 3, 1]
len(a) # 3

Возвращает отсортированный список:

a = [8, 1, 3, 2]
sorted(a) # [1, 2, 3, 8]

Возвращают наименьший и наибольший элемент списка:

a = [1, 9, -2, 3]
min(a) # -2
max(a) # 9

Чтобы проще управлять элементами списка, в стандартной библиотеке Python есть набор популярных методов для списков. Разберём основные из них.

Добавляет новый элемент в конец списка:

a = [1, 2, 3]
a.append(4)
print(a) 

>>> [1, 2, 3, 4]

Добавляет набор элементов в конец списка:

a = [1, 2, 3]
a.extend([4, 5])
print(a) 

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

Внутрь метода extend () нужно передать итерируемый объект — например, другой list или строку.

Вот так метод extend () добавит строку:

a = ['cat', 'dog', 'bat']
a.extend('mouse')
print(a)

>>> ['cat', 'dog', 'bat', 'm', 'o', 'u', 's', 'e']

Заметьте, что строка добавилась посимвольно.

Добавляет новый элемент по индексу:

a = [1, 2, 3]
a.insert(0, 4)
print(a)

>>> [4, 1, 2, 3]

Сначала мы передаём индекс, по которому хотим вставить новый элемент, а затем сам элемент.

Удаляет элемент из списка:

a = [1, 2, 3, 1]
a.remove(1)
print(a) 

>>> [2, 3, 1]

Метод удаляет только первое вхождение элемента. Остальные остаются нетронутыми.

Если элемента нет в списке, Python вернёт ошибку и программа прервётся:

a = [1, 2, 3, 1]
a.remove(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

Ошибка говорит, что элемента нет в списке.

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

a = [1, 2, 3]
a.clear()
print(a) 

>>> []

Возвращает индекс элемента списка в Python:

a = [1, 2, 3]
print(a.index(2)) 

>>> 1

Если элемента нет в списке, выведется ошибка:

a = [1, 2, 3]
print(a.index(4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 4 is not in list

Удаляет элемент по индексу и возвращает его как результат:

a = [1, 2, 3]
print(a.pop())
print(a)

>>> 3
>>> [1, 2]

Мы не передали индекс в метод, поэтому он удалил последний элемент списка. Если передать индекс, то получится так:

a = [1, 2, 3]
print(a.pop(1)) 
print(a) 

>>> 2
>>> [1, 3]

Считает, сколько раз элемент повторяется в списке:

a = [1, 1, 1, 2]
print(a.count(1)) 

>>> 3

Сортирует список:

a = [4, 1, 5, 2]
a.sort() # [1, 2, 4, 5]

Если нам нужно отсортировать в обратном порядке — от большего к меньшему, — в методе есть дополнительный параметр reverse:

a = [4, 1, 5, 2]
a.sort(reverse=True) # [5, 4, 2, 1]

Переставляет элементы в обратном порядке:

a = [1, 3, 2, 4]
a.reverse() # [4, 2, 3, 1]

Копирует список:

a = [1, 2, 3]
b = a.copy()

print(b)

>>> [1, 2, 3]

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

Метод Что делает
a.append(x) Добавляет элемент x в конец списка a. Если x — список, то он появится в a как вложенный
a.extend(b) Добавляет в конец a все элементы списка b
a.insert(i, x) Вставляет элемент x на позицию i
a.remove(x) Удаляет в a первый элемент, значение которого равно x
a.clear() Удаляет все элементы из списка a и делает его пустым
a.index(x) Возвращает индекс элемента списка
a.pop(i) Удаляет элемент по индексу и возвращает его
a.count(x) Считает, сколько раз элемент повторяется в списке
a.sort() Сортирует список. Чтобы отсортировать элементы в обратном порядке, нужно установить дополнительный аргумент reverse=True
a.reverse() Возвращает обратный итератор списка a
a.copy() Создаёт поверхностную копию списка. Для создания глубокой копии используйте метод deepcopy из модуля copy

Лучше не учить это всё, а применять на практике. А ещё лучше — попытаться написать каждый метод самостоятельно, не используя никакие встроенные функции.

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

Научитесь: Профессия Python-разработчик
Узнать больше

Содержание:развернуть

  • Что такое список
  • Как списки хранятся в памяти?

  • Базовая работа со списками
  • Объявление списка

  • Обращение к элементу списка в Python

  • Добавление в список

  • Добавление в список на указанную позицию

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

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

  • Как проверить наличие элемента в списке

  • Объединение списков

  • Копирование списка Python

  • Цикл по списку

  • Методы списков
  • Вложенные списки
  • Срезы
  • Генераторы списков
  • Best Practices
  • Как получить список в обратном порядке

  • Как перевести список в другой формат?

  • Как узнать индекс элемента в списке?

  • Как посчитать количество уникальных элементов в списке?

  • Как проверить список на пустоту?

  • Как создать список числовых элементов с шагом

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

Ниже разберёмся, как устроены списки, как с ними работать и приведём 6 примеров из практики.

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

Список (list) — тип данных, предназначенный для хранения набора или последовательности разных элементов.

[1, 33, 6, 9] # литерал списка в Python

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

Как списки хранятся в памяти?

Базовая C-структура списков в Python (CPython) выглядит следующим образом:

typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;

Когда мы создаём список, в памяти под него резервируется объект, состоящий из 3-х частей:

  • PyObject_VAR_HEAD — заголовок;
  • ob_item — массив указателей на элементы списка;
  • allocated — количество выделенной памяти под элементы списка.

Объект списка хранит указатели на объекты, а не на сами объекты

Python размещает элементы списка в памяти, затем размещает указатели на эти элементы. Таким образом, список в Python — это массив указателей.

Список в Python — это массив указателей на элементы, размещенные в памяти

Базовая работа со списками

Объявление списка

Объявление списка — самый первый и главный этап его создания. Для объявления списка в Python существует несколько способов.

Вариант №1: Через литерал (выражение, создающее объект):

>>> elements = [1, 3, 5, 6]

>>> type(elements)
<class 'list'>

>>> print(elements)
[1, 3, 5, 6]

В данном примере мы создали список с заранее известными данными. Если нужен пустой список, в квадратных скобках ничего не указывается — elements = [].

Вариант №2: Через функцию list():

>>> elements = list()

>>> type(elements)
<class 'list'>

>>> print(elements)
[]

В этом примере создается пустой список.

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

Чтобы обратиться к элементу списка, достаточно указать его индекс:

>>> elements = [1, 2, 3, 'word']

>>> elements[3]
'word'

Индекс — это порядковый номер элемента в списке. В примере выше индексы (позиции в списке) соответственно будут: 0, 1, 2, 3.

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

Существует также отрицательный индекс, рассмотрим на примере:

>>> elements = [1, 2, 3, 'word']

>>> elements[-4]
1

>>> elements[-1]
'word'

Отрицательные индексы работают справа налево (то есть индекс значения ‘1’ — -4, а отрицательный индекс ‘word’ — -1.

💡 Отрицательным индексом удобно пользоваться, когда необходимо обратиться к последнему элементу в списке, не высчитывая его номер. Любой конечный элемент будет с индексом, равным -1.

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

В списках доступно добавление, изменение, удаление элементов. Рассмотрим каждый способ изменения элементов на примерах.

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

>>> elements = [1, 2, 3, 'word']
>>> elements.append('meow')

>>> print(elements)
[1, 2, 3, 'word', 'meow']

Для простого примера, рассмотрим создание списка с нуля с помощью метода append() :

>>> elements = []
>>> elements.append(1)
>>> elements.append('word')
>>> elements.append('meow')

>>> print(elements)
[1, 'word', 'meow']

Добавление в список на указанную позицию

Немаловажно обратить внимание на метод list.insert(i, x), где list — список, i — позиция, x — нужное значение.

>>> elements = [1, 2, 4]
>>> print(elements)
[1, 2, 4]

>>> elements.insert(2, 3)
>>> print(elements)
[1, 2, 3, 4]

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

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

>>> elements = [2, 4, 6]
>>> elements[2] = 8

>>> print(elements)
[2, 4, 8]

В примере выше мы заменили 6 на 8.

Не забывайте, что счёт начинается с нуля, и в данном списке цифра 6 это 2-й элемент

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

Для удаление из списка используют инструкцию del list[i], где list — список, i — индекс (позиция) элемента в списке:

>>> elements = [1, "test", 5, 7]
>>> del elements[1]
>>> print(elements)
[1, 5, 7]

Удалять можно как из текущего списка, так и из вложенных списков:

>>> my_list = ["hello", "world", "!"]
>>> elements = [1, my_list, "ok"]
>>> del elements[1][2]

>>> print(elements)
[1, ['hello', 'world'], 'ok']

Можно удалять целыми диапазонами:

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[2:] # удаляем все элементы после 2-го элемента (включительно)
>>> print(elements)
[2, 4]

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[:3] # удаляем все элементы до 3-го элемента
>>> print(elements)
[8, 12]

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[1:3] # удаляем от 1-го элемента включительно до 3-го элемента
>>> print(elements)
[2, 8, 12]

Еще один способ удаления из списка — list.remove(x), где list — список, x — значение, которое нужно удалить:

>>> elements = [2, "test", 4]
>>> elements.remove("test")
>>> print(elements)
[2, 4]

Как проверить наличие элемента в списке

Для того чтобы проверить существование какого-либо элемента в списке, нужно воспользоваться оператором in. Рассмотрим на примере:

>>> elements = ['слон', 'кот', 'лошадь', 'змея', 'рыба']
>>> if 'кот' in elements:
print('meow')

meow

Объединение списков

Списки в Python можно объединять с помощью оператора + или метода extend . Выглядит это так:

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

>>> hello = ["h", "e", "l", "l", "o"]
>>> world = ["w", "o", "r", "l", "d"]
>>> hello.extend(world) # extends не возвращает новый список, а дополняет текущий
>>> print(hello)
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

Копирование списка Python

Если вы захотите скопировать список оператором =, вы скопируете не сам список, а только его ссылку.

>>> a = [1, 2, 3]
>>> b = a # переменной b присваивается не значение списка a, а его адрес

>>> print(id(a), id(b))
56466376 56466376 # a и b ссылаются на один и тот же список

>>> b.append(4)
>>> print(a, b)
[1, 2, 3, 4] [1, 2, 3, 4]

Для копирования списков можно использовать несколько вариантов:

  • elements.copy() — встроенный метод copy (доступен с Python 3.3);
  • list(elements) — через встроенную функцию list() ;
  • copy.copy(elements) — функция copy() из пакета copy;
  • elements[:] — через создание среза (устаревший синтаксис).

Рассмотрим на примере каждый из этих способов:

>>> a = ["кот", "слон", "змея"]

>>> b = a.copy()
>>> print(id(a), id(b), a, b)
56467336 56467016 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> d = list(a)
>>> print(id(a), id(d), a, d)
56467336 60493768 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> import copy
>>> e = copy.copy(a) #
>>> print(id(a), id(e), a, e)
56467336 60491304 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> f = copy.deepcopy(a)
>>> print(id(a), id(f), a, f)
56467336 56467400 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> c = a[:] # устаревший синтаксис
>>> print(id(a), id(c), a, c)
56467336 60458408 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

Важно: copy.copy(a) делает поверхностное копирование. Объекты внутри списка будут скопированы как ссылки на них (как в случае с оператором =). Если необходимо рекурсивно копировать всех элементов в списке, используйте copy.deepcopy(a)

Скопировать часть списка можно с помощью срезов. Есть несколько вариантов использования:

>>> a = ["кот", "слон", "змея"]

>>> b = a[2:] # с 2-го элемента (включительно) до конца списка
>>> print(b)
['змея']

>>> c = a[:2] # с начала списка по 2-й элемент
>>> print(c)
['кот', 'слон']

>>> d = a[1:2] # с 1-го элемента (включительно) по 2-й элемент
>>> print(d)
['слон']

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> e = a[0:8:2] # c 0-го элемента по 8-й элемент с шагом 2
>>> print(e)
[1, 3, 5, 7]

Цикл по списку

Для перебора списков в Python есть два цикла: for и while.

elements = [1, 2, 3, "meow"]
for el in elements:
print(el)

Результат выполнения:

1
2
3
meow

Попробуем построить цикл while. Он выполняется, когда есть какое-либо определённое условие:

elements = [1, 2, 3, "meow"]
elements_len = len(elements)
i = 0
while i < elements_len:
print(elements[i])
i += 1

Результат выполнения:

1
2
3
meow

Из примеров выше можем сделать вывод, что конструкция for выглядит заметно компактнее, чем while.

Методы списков

  • list.append(x) — позволяет добавлять элемент в конец списка;
  • list1.extend(list2) — предназначен для сложения списков;
  • list.insert(i, x) — служит для добавления элемента на указанную позицию(i — позиция, x — элемент);
  • list.remove(x) — удаляет элемент из списка (только первое вхождение);
  • list.clear() — предназначен для удаления всех элементов (после этой операции список становится пустым []);
  • list.copy() — служит для копирования списков.
  • list.count(x) — посчитает количество элементов x в списке;
  • list.index(x) — вернет позицию первого найденного элемента x в списке;
  • list.pop(i) — удалит элемент из позиции i ;
  • list.reverse() — меняет порядок элементов в списке на противоположный;
  • list.sort() — сортирует список.

Пример использования методов:

# append
>>> a = [1, 2, 3]
>>> a.append(4)
print(a)
[1, 2, 3, 4]

# extend
>>> elements = [1, 2, 3, "meow"]
>>> elements.extend([4, 5, "gaf"])
>>> print(elements)
[1, 2, 3, 'meow', 4, 5, 'gaf']

# insert
>>> a = [1, 3, 4]
>>> a.insert(1, 2) # insert добавит на позицию 1 цифру 2
>>> print(a)
[1, 2, 3, 4]

# remove
>>> elements = [1, "meow", 3, "meow"]
>>> elements.remove("meow") # remove удалит только первое вхождение
>>> print(elements)
[1, 3, 'meow']

# clear
>>> a = [1, 2, 3]
>>> a.clear()
>>> print(a)
[]

# copy
>>> a = [1, 2, 3]
>>> b = a.copy()
>>> print(id(a), id(b), a, b)
60458408 60491880 [1, 2, 3] [1, 2, 3]

# count
>>> elements = ["one", "two", "three", "one", "two", "one"]
>>> print(elements.count("one"))
3

# index
>>> elements = ["one", "two", "three", "one", "two", "three"]
>>> print(elements.index("three")) # index вернет первый найденный индекс
2

# pop (положительный индекс)
>>> elements = [1, "meow", 3, "wow"]
>>> elements.pop(1) # удаляет элемент с индексом 1
'meow' # pop возвращает удаленный элемент списка
>>> print(elements)
[1, 3, 'wow']

# pop (отрицательный индекс) [удаление с конца списка, начиная с -1]
elements = ["hello", "world", "!"]
elements.pop(-2)
'world'
>>> print(elements)
['hello', '!']

# pop (без индекса) [удалит из списка последний элемент]
>>> elements = [1, 2, 3]
>>> elements.pop() # по умолчанию, в методе pop индекс равен -1
3
>>> print(elements)
[1, 2]

# reverse
>>> a = [1, 2, 3]
>>> a.reverse()
>>> print(a)
[3, 2, 1]

# sort (по возрастанию)
>>> elements = [3, 19, 0, 3, 102, 3, 1]
>>> elements.sort()
>>> print(elements)
[0, 1, 3, 3, 3, 19, 102]

# sort (по убыванию)
>>> elements = [3, 19, 0, 3, 102, 3, 1]
>>> elements.sort(reverse = True)
>>> print(elements)
[102, 19, 3, 3, 3, 1, 0]

Вложенные списки

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

>>> elements = [1, 2, [0.1, 0.2, 0.3]]

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

>>> elements = [["яблоки", 50], ["апельсины", 190], ["груши", 100]]

>>> print(elements[0])
['яблоки', 50]

>>> print(elements[1][0])
апельсины

Срезы

Срезы (slices) — это подмножества элементов списка. Срезу нужны, когда необходимо извлечь часть списка из полного списка.

У них есть свой собственный синтаксис. Записывается срез так же, как обращение к элементу, используя индекс. Пример:

elements[START:STOP:STEP]

В этом случае берётся срез от номера start (включительно) до stop (не включая его), а step — это шаг. По умолчанию start и stop равны 0, step равен 1.

>>> elements = [0.1, 0.2, 1, 2, 3, 4, 0.3, 0.4]
>>> int_elements = elements[2:6] # с 2-го элемента включительно по 6-й элемент

>>> print(id(elements), id(int_elements)) # elements и int_elements - 2 разных списка
53219112 53183848

>>> print(elements)
[0.1, 0.2, 1, 2, 3, 4, 0.3, 0.4] # срез не модифицирует исходный список

>>> print(int_elements)
[1, 2, 3, 4]

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

Генератором списка называется способ построения списка с применением выражения к каждому элементу, входящему в последовательность. Есть схожесть генератора списка и цикла for. На этом примере мы рассмотрим простейший генератор списков:

>>> c = [c * 3 for c in 'list']

>>> print(c)
['lll', 'iii', 'sss', 'ttt']

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

Пример генератора списка:

>>> nums = [i for i in range(1, 15)]
>>> print(nums)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Пример посложнее:

>>> c = [c + d for c in 'list' if c != 'i' for d in 'spam' if d != 'a']
>>> print(c)
['ls', 'lp', 'lm', 'ss', 'sp', 'sm', 'ts', 'tp', 'tm']

Это усложнённая конструкция генератора списков, в которой мы сделали все возможные наборы сочетаний букв из введённых слов. Буквы-исключения видны по циклу, где стоит знак != для одной переменной и другой.

Best Practices

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

Как получить список в обратном порядке

Изменить порядок размещения элементов в списке помогает функция list.reverse():

>>> elements = [1, 2, 3, 4, 5, 6]
>>> elements.reverse()

>>> print(elements)
[6, 5, 4, 3, 2, 1]

Как перевести список в другой формат?

Иногда требуется перевести список в строку, в словарь или в JSON. Для этого нужно будет вывести список без скобок.

Перевод списка в строку осуществляется с помощью функции join(). На примере это выглядит так:

>>> fruits = ["яблоко", "груша", "ананас"]

>>> print(', '.join(fruits))
яблоко, груша, ананас

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

Словарь в Python — это такая же встроенная структура данных, наряду со списком. Преобразование списка в словарь — задача тоже несложная. Для этого потребуется воспользоваться функцией dict(). Вот пример преобразования:

>>> elements = [['1', 'a'],['2', 'b'],['3', 'c']]
>>> my_dict = dict(elements)

>>> print(my_dict)
{'1': 'a', '2': 'b', '3': 'c'}

JSON — это JavaScript Object Notation. В Python находится встроенный модуль json для кодирования и декодирования данных JSON. С применением метода json.dumps(x) можно запросто преобразовать список в строку JSON.

>>> import json
>>> json.dumps(['word', 'eye', 'ear'])
'["word", "eye", "ear"]'

Как узнать индекс элемента в списке?

Узнать позицию элемента в последовательности списка бывает необходимым, когда элементов много, вручную их не сосчитать, и нужно обращение по индексу. Для того чтобы узнать индекс элемента, используют функцию list.index(x).

>>> elements = [1, 3, 6, 9, 55]

>>> print(elements.index(9))
3

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

Как посчитать количество уникальных элементов в списке?

Самый простой способ — приведение списка к set (множеству). После этого останутся только уникальные элементы, которые мы посчитаем функцией len():

>>> words = ["one", "two", "one", "three", "one"]
>>> len(set(words))
3

Как проверить список на пустоту?

>>> a = []
>>> if not a:
print("список пуст!")

список пуст!

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

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

Шагом называется переход от одного элемента к другому. Если шаг отрицательный, произойдёт реверс массива, то есть отсчёт пойдёт справа налево. Вот так выглядит список с шагом.

>>> elements = [1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 20]
>>> print(elements[0:11:2])
[1, 3, 5, 9, 11, 20]

Еще один вариант — воспользоваться генератором списков:

>>> elements = [c for c in range(0, 10, 2)] # от 0 (включительно) до 10 с шагом 2

>>> print(elements)
[0, 2, 4, 6, 8]


При разработке на языке Python, списки встречаются довольно часто. Знание основ работы со списками поможет быстро и качественно писать программный код 😉.

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

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

  1. Хранение в памяти
  2. Создание списка
  3. Срезы (slice)
  4. Простые операции
  5. Методы списков

Хранение в памяти

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

numbers = [1, 2]
numbers[1] = 3
# обновлённый список: [1, 3]

До замены элемента последовательности print(numbers[1]) выведет 2, а после замены — 3.

Это можно сделать несколькими способами, например перечислением элементов списка в квадратных скобках:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

При этом единица будет на позиции 0, то есть print(numbers[0]) выведет 1.

Также можно использовать обработку итерируемого объекта функцией list(). Пусть у нас будет некоторая строка, тогда:

list('tproger')
# ['t', 'p', 'r', 'o', 'g', 'e', 'r']

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

numbers = [i for i in range(1,6)]
# [1, 2, 3, 4, 5]

Срезы (slice) списка

Срезы позволяют получить некое подмножество значений. Следующий код вернёт список с элементами, начиная индексом 0 и не включая при этом индекс 2 и выше:

numbers = [1, 5, 9, 6]
print(numbers[0:2])
# вывод [1, 5]

Далее выведем всё, за исключением элемента на позиции 3:

print(numbers[:3])
# вывод [1, 5, 9]

А теперь начиная с индекса 1 и до конца:

print(numbers[1:])
# вывод [5, 9, 6]

Операции над списками Python

  • x in ltrue, если элемент x есть в списке l;
  • x not in ltrue, если элемент x отсутствует в l;
  • l1 + l2 — объединение двух списков;
  • l * n , n * l — копирует список n раз;
  • len(l) — количество элементов в l;
  • min(l) — наименьший элемент;
  • max(l) — наибольший элемент;
  • sum(l) — сумма чисел списка;
  • for i in list() — перебирает элементы слева направо.

Методы списков Python

Index

Возвращает положение первого совпавшего элемента. Поиск совпадения происходит слева направо. Пример:

numbers = [1, 5, 9, 6, 1, 2, 1]
print(numbers.index(1))
# вывод 0: первая найденная единица на позиции 0

Count

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

numbers = [1, 5, 9, 6, 1, 2, 1]
print(numbers.count(1))
# вывод 3, потому что единица встречается 3 раза

Append

Добавляет указанное значение в конец:

numbers = [1, 5, 9, 6]
numbers.append(3)
# обновлённый список: [1, 5, 9, 6, 3]

Sort

Сортирует список в Пайтоне. По умолчанию от меньшего к большему:

numbers = [1, 5, 9, 6]
numbers.sort()
# обновлённый список: [1, 5, 6, 9]

Также можно сортировать последовательность элементов от большего к меньшему:

numbers = [1, 5, 9, 6]
numbers.sort(reverse = true)
# обновлённый список: [9, 6, 5, 1]

Insert

Вставляет элемент перед указанным индексом:

numbers = [1, 5, 9, 6]
numbers.insert(3, [2, 3])
# обновлённый список: [1, 5, 9, [2, 3], 6]

Remove

Удаляет первое попавшееся вхождение элемента в списке Python:

numbers = [1, 5, 9, 6, 1, 2, 1]
numbers.remove(1)
# обновлённый список: [5, 9, 6, 1, 2, 1]

Extend

Подобно методу append(), добавляет элементы, но преимущество метода extend() в том, что он также позволяет добавлять списки:

numbers = [1, 5, 9, 6]
numbers.extend([2, 3])
# обновлённый список: [1, 5, 9, 6, 2, 3]

Pop

А данный метод удаляет элемент в конкретно указанном индексе, а также выводит удалённый элемент. Если индекс не указан, метод по умолчанию удалит последний элемент:

numbers = [1, 5, 9, 6]
numbers.pop(1)
# получаем:
# 5
# [1, 9, 6]

Join

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

mylist = ['сайт', 'типичный', 'программист']
print(', '.join(mylist))
# вывод 'сайт, типичный, программист'

Список

Назад в начало

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

Создание пустого списка выглядит так:

empty_list = []

Создадим список, состоящий из нескольких чисел:

numbers = [40, 20, 90, 11, 5]

Настало время строковых переменных:

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

Не будем забывать и о дробях:

fractions = [3.14, 2.72, 1.41, 1.73, 17.9]

Мы можем создать список, состоящий из различных типов данных:

values = [3.14, 10, ‘Hello world!’, False, ‘Python is the best’]

И такое возможно (⊙_⊙)

list_of_lists = [[2, 4, 0], [11, 2, 10], [0, 19, 27]]

Индексирование

Что же такое индексирование? Это загадочное слово обозначает операцию обращения к элементу по его порядковому номеру ( ( ・ω・)ア напоминаю, что нумерация начинается с нуля). Проиллюстрируем это на примере:

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

print(fruits[0])

print(fruits[1])

print(fruits[4])

>>> Apple

>>> Grape

>>> Orange

Списки в Python являются изме­няемым типом данных. Мы можем изменять содер­жимое каждой из ячеек:

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

fruits[0] = ‘Watermelon’

fruits[3] = ‘Lemon’

print(fruits)

>>> [‘Watermelon’, ‘Grape’, ‘Peach’, ‘Lemon’, ‘Orange’]

Индексирование работает и в обратную сторону. Как такое возможно? Всё просто, мы обра­щаемся к элементу списка по отрица­тельному индексу. Индекс с номе­ром -1 дает нам доступ к после­днему элементу, -2 к предпоследнему и так далее.

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

print(fruits[-1])

print(fruits[-2])

print(fruits[-3])

print(fruits[-4])

>>> Orange

>>> Banan

>>> Peach

>>> Grape

Создание списка с помощью list()

Переходим к способам создания списка. Самый простой из них был приведен выше. Еще раз для закрепления:

smiles = [‘(ಠ_ಠ)’, ‘( ̄﹃ ̄)’, ‘( ͡° ͜ʖ ͡°)’, ‘(╮°-°)╮’]

А есть еще способы? Да, есть. Один из них — создание списка с помощью функции list() В неё мы можем передать любой итерируемый объект (да-да, тот самый по которому можно запустить цикл (• ᵕ •) )

Рассмотрим несколько примеров:

letters = list(‘abcdef’)

numbers = list(range(10))

even_numbers = list(range(0, 10, 2))

print(letters)

print(numbers)

print(even_numbers)

>>> [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> [0, 2, 4, 6, 8]

Длина списка

С созданием списка вроде ра­зобрались. Следующий вопрос: как узнать длину списка? Можно, конечно, просто посчитать количество элементов… (⊙_⊙) Но есть способ получше! Функция len() возвращает длину любой итерируемой переменной, переменной, по которой можно запустить цикл. Рассмотрим пример:

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

print(len(fruits))

>>> 5

numbers = [40, 20, 90]

print(len(numbers))

>>> 3

“…любой итерируемой”, а это значит:

string = ‘Hello world’

print(len(string))

# 11

>>> 11

print(len(range(10))

>>> 10

Срезы

В начале статьи что-то гово­рилось о “срезах”. Давайте разберем подробнее, что это такое. Срезом называется неко­торая подпос­ледователь­ность. Принцип действия срезов очень прост: мы “отре­заем” кусок от исходной последова­тель­ности элемента, не меняя её при этом. Я сказал “последо­вательность”, а не “спи­сок”, потому что срезы работают и с другими итерируемыми типами данных, например, со строками.

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

part_of_fruits = fruits[0:3]

print(part_of_fruits)

>>> [‘Apple’, ‘Grape’, ‘Peach’]

Детально рассмотрим синтаксис срезов:

итерируемая_переменная[начальный_индекс:конечный_индекс 1:длина_шага]

Обращаю ваше внимание, что мы делаем срез от начального индекса до конечного индекса – 1. То есть i = начальный_индекс и i < конечный индекс

Больше примеров!

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

print(fruits[0:1])

# Если начальный индекс равен 0, то его можно опустить

print(fruits[:2])

print(fruits[:3])

print(fruits[:4])

print(fruits[:5])

# Если конечный индекс равен длине списка, то его тоже можно опустить

print(fruits[:len(fruits)])

print(fruits[::])

>>> [‘Apple’]

>>> [‘Apple’, ‘Grape’]

>>> [‘Apple’, ‘Grape’, ‘Peach’]

>>> [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’]

>>> [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

>>> [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

>>> [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

Самое время понять, что делает третий параметр среза – длина шага!

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

print(fruits[::2])

print(fruits[::3])

# Длина шага тоже может быть отрицательной!

print(fruits[::-1])

print(fruits[4:2:-1])

print(fruits[3:1:-1])

>>> [‘Apple’, ‘Peach’, ‘Orange’]

>>> [‘Apple’, ‘Banan’]

>>> [‘Orange’, ‘Banan’, ‘Peach’, ‘Grape’, ‘Apple’]

>>> [‘Orange’, ‘Banan’]

>>> [‘Banan’, ‘Peach’]

А теперь вспоминаем всё, что мы знаем о циклах. В Python их целых два! Цикл for и цикл while Нас интересует цикл for, с его помощью мы можем перебирать зна­чения и индексы наших последовательностей. Начнем с перебора значений:

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

for fruit in fruits:

    print(fruit, end=‘ ‘)

>>> Apple Grape Peach Banan Orange

Выглядит несложно, правда? В переменную fruit объявлен­ную в цикле по очереди записываются значения всех элементов списка fruits

А что там с перебором индексов?

for index in range(len(fruits)):

    print(fruits[index], end=‘ ‘)

Этот пример гораздо интереснее предыдущего! Что же здесь происходит? Для начала разбе­ремся, что делает функция range(len(fruits))

Мы с вами знаем, что функция len() возвращает длину списка, а range() генерирует диапазон целых чисел от 0 до len()-1.

Сложив 2+2, мы получим, что переменная index принимает значения в диапазоне от 0 до len()-1. Идем дальше, fruits[index] – это обращение по индексу к элементу с индексом index списка fruits. А так как переменная index принимает значения всех индексов списка fruits, то в цикле мы переберем значения всех элементов нашего списка!

Операция in

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

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

if ‘Apple’ in fruits:

    print(‘В списке есть элемент Apple’)

>>> В списке есть элемент Apple

fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

if ‘Lemon’ in fruits:

    print(‘В списке есть элемент Lemon’)

else:’

    print(‘В списке НЕТ элемента Lemon’)

>>> В списке НЕТ элемента Lemon

Приведу более сложный пример:

all_fruits = [‘Apple’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Orange’]

my_favorite_fruits = [‘Apple’, ‘Banan’, ‘Orange’]

for item in all_fruits:

    if item in my_favorite_fruits:

        print(item + ‘ is my favorite fruit’)

    else:

        print(‘I do not like ‘ + item)

>>> Apple is my favorite fruit

>>> I do not like Grape

>>> I do not like Peach

>>> Banan is my favorite fruit

>>> Orange is my favorite fruit

Методы для работы со списками

Начнем с метода append(), который добавляет элемент в конец списка:

# Создаем список, состоящий из четных чисел от 0 до 8 включительно

numbers = list(range(0,10,2))

# Добавляем число 200 в конец списка

numbers.append(200)

numbers.append(1)

numbers.append(2)

numbers.append(3)

print(numbers)

>>> [0, 2, 4, 6, 8, 200, 1, 2, 3]

Мы можем передавать методу append() абсолютно любые значения:

all_types = [10, 3.14, ‘Python’, [‘I’, ‘am’, ‘list’]]

all_types.append(1024)

all_types.append(‘Hello world!’)

all_types.append([1, 2, 3])

print(all_types)

>>> [10, 3.14, ‘Python’, [‘I’, ‘am’, ‘list’], 1024, ‘Hello world!’, [1, 2, 3]]

Метод append() отлично выпол­няет свою функцию. Но, что делать, если нам нужно добавить элемент в сере­дину списка? Это умеет метод insert(). Он добавляет элемент в список на произ­вольную позицию. insert() принимает в качестве первого аргу­мента позицию, на которую нужно вставить элемент, а вторым — сам элемент.

# Создадим список чисел от 0 до 9

numbers = list(range(10))

# Добавление элемента 999 на позицию с индексом 0

numbers.insert(0, 999)

print(numbers) # первый print

numbers.insert(2, 1024)

print(numbers) # второй print

numbers.insert(5, ‘Засланная строка-шпион’)

print(numbers) # третий print

>>> [999, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # первый print

>>> [999, 0, 1024, 1, 2, 3, 4, 5, 6, 7, 8, 9] # второй print

>>> [999, 0, 1024, 1, 2, ‘Засланная строка-шпион’, 3, 4, 5, 6, 7, 8, 9] # третий print

Отлично! Добавлять элементы в список мы научи­лись, осталось понять, как их из него удалять. Метод pop() удаляет эле­мент из списка по его индексу:

numbers = list(range(10))

print(numbers) # 1

# Удаляем первый элемент

numbers.pop(0)

print(numbers) # 2

numbers.pop(0)

print(numbers) # 3

numbers.pop(2)

print(numbers) # 4

# Чтобы удалить последний элемент, вызовем метод pop без аргументов

numbers.pop()

print(numbers) # 5

numbers.pop()

print(numbers) # 6

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 1

>>> [1, 2, 3, 4, 5, 6, 7, 8, 9] # 2

>>> [2, 3, 4, 5, 6, 7, 8, 9] # 3

>>> [2, 3, 5, 6, 7, 8, 9] # 4

>>> [2, 3, 5, 6, 7, 8] # 5

>>> [2, 3, 5, 6, 7] # 6

Теперь мы знаем, как удалять элемент из списка по его инде­ксу. Но что, если мы не знаем индекса элемента, но знаем его значение? Для такого случая у нас есть метод remove(), кото­рый удаляет пер­вый найденный по значению элемент в списке.

all_types = [10, ‘Python’, 10, 3.14, ‘Python’, [‘I’, ‘am’, ‘list’]]

all_types.remove(3.14)

print(all_types) # 1

all_types.remove(10)

print(all_types) # 2

all_types.remove(‘Python’)

print(all_types) # 3

>>> [10, ‘Python’, 10, ‘Python’, [‘I’, ‘am’, ‘list’]] # 1

>>> [‘Python’, 10, ‘Python’, [‘I’, ‘am’, ‘list’]] # 2

>>> [10, ‘Python’, [‘I’, ‘am’, ‘list’]] # 3

А сейчас немного посчитаем, посчитаем эле­менты списка с помощью метода count()

numbers = [100, 100, 100, 200, 200, 500, 500, 500, 500, 500, 999]

print(numbers.count(100)) # 1

print(numbers.count(200)) # 2

print(numbers.count(500)) # 3

print(numbers.count(999)) # 4

>>> 3 # 1

>>> 2 # 2

>>> 5 # 3

>>> 1 # 4

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

numbers = [100, 2, 11, 9, 3, 1024, 567, 78]

numbers.sort()

print(numbers) # 1

fruits = [‘Orange’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Apple’]

fruits.sort()

print(fruits) # 2

>>> [2, 3, 9, 11, 78, 100, 567, 1024] # 1

>>> [‘Apple’, ‘Banan’, ‘Grape’, ‘Orange’, ‘Peach’] # 2

Мы можем изменять порядок сортировки с помощью пара­метра reverse. По умол­чанию этот параметр равен False

fruits = [‘Orange’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Apple’]

fruits.sort()

print(fruits) # 1

fruits.sort(reverse=True)

print(fruits) # 2

>>> [‘Apple’, ‘Banan’, ‘Grape’, ‘Orange’, ‘Peach’] # 1

>>> [‘Peach’, ‘Orange’, ‘Grape’, ‘Banan’, ‘Apple’] # 2

Иногда нам нужно перевернуть список, не спраши­вайте меня зачем… Для этого в самом лучшем языке прог­рам­миро­вания на этой планете JavaScr..­Python есть метод reverse():

numbers = [100, 2, 11, 9, 3, 1024, 567, 78]

numbers.reverse()

print(numbers) # 1

fruits = [‘Orange’, ‘Grape’, ‘Peach’, ‘Banan’, ‘Apple’]

fruits.reverse()

print(fruits) # 2

>>> [78, 567, 1024, 3, 9, 11, 2, 100] # 1

>>> [‘Apple’, ‘Banan’, ‘Peach’, ‘Grape’, ‘Orange’] # 2

Допустим, у нас есть два списка и нам нужно их объединить. Програм­мисты на C++ cразу же кинулись писать циклы for, но мы пишем на python, а в python у спис­ков есть полез­ный метод extend(). Этот метод вызы­вается для одного списка, а в качестве аргу­мента ему пере­дается другой список, extend() запи­сывает в конец первого из них начало вто­рого:

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

vegetables = [‘Tomato’, ‘Cucumber’, ‘Potato’, ‘Carrot’]

fruits.extend(vegetables)

print(fruits)

>>> [‘Banana’, ‘Apple’, ‘Grape’, ‘Tomato’, ‘Cucumber’, ‘Potato’, ‘Carrot’]

В природе существует специ­аль­ный метод для очистки списка — clear()

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

vegetables = [‘Tomato’, ‘Cucumber’, ‘Potato’, ‘Carrot’]

fruits.clear()

vegetables.clear()

print(fruits)

print(vegetables)

>>> []

>>> []

Осталось совсем чуть-чуть всего лишь пара мето­дов, так что делаем последний рывок! Метод index() возв­ращает индекс эле­мента. Рабо­тает это так: вы пере­даете в качестве аргу­мента в index() значение элемента, а метод возв­ращает его индекс:

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

print(fruits.index(‘Apple’))

print(fruits.index(‘Banana’))

print(fruits.index(‘Grape’))

>>> 1

>>> 0

>>> 2

Финишная прямая! Метод copy(), только не падайте, копирует список и возвра­щает его брата-близнеца. Вообще, копи­ро­вание списков – это тема доста­точно инте­ресная, давай­те рас­смотрим её по-подробнее.

Во-первых, если мы просто прис­воим уже сущест­вующий список новой пере­менной, то на первый взгляд всё выглядит неплохо:

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

new_fruits = fruits

print(fruits)

print(new_fruits)

>>> [‘Banana’, ‘Apple’, ‘Grape’]

>>> [‘Banana’, ‘Apple’, ‘Grape’]

Но есть одно маленькое “НО”:

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

new_fruits = fruits

fruits.pop()

print(fruits)

print(new_fruits)

# Внезапно, из списка new_fruits исчез последний элемент

>>> [‘Banana’, ‘Apple’]

>>> [‘Banana’, ‘Apple’]

При прямом присваивании спис­ков копи­рования не проис­ходит. Обе пере­менные начи­нают ссылаться на один и тот же список! То есть если мы изме­ним один из них, то изме­нится и другой. Что же тогда делать? Пользоваться методом copy(), конечно:

fruits = [‘Banana’, ‘Apple’, ‘Grape’]

new_fruits = fruits.copy()

fruits.pop()

print(fruits)

print(new_fruits)

>>> [‘Banana’, ‘Apple’]

>>> [‘Banana’, ‘Apple’, ‘Grape’]

Отлично! Но что если у нас список в списке? Скопируется ли внутренний список с помощью метода copy() — нет:

fruits = [‘Banana’, ‘Apple’, ‘Grape’, [‘Orange’,‘Peach’]]

new_fruits = fruits.copy()

fruits[-1].pop()

print(fruits) # 1

print(new_fruits) # 2

>>> [‘Banana’, ‘Apple’, ‘Grape’, [‘Orange’]] # 1

>>> [‘Banana’, ‘Apple’, ‘Grape’, [‘Orange’]] # 2

Решение задач

1. Создайте список из 10 четных чисел и выведите его с помощью цикла for

2. Создайте список из 5 элементов. Сделайте срез от второго индекса до четвертого

3. Создайте пустой список и добавьте в него 10 случайных чисел и выведите их. В данной задаче нужно использовать функцию randint.

from random import randint

n = randint(1, 10) # Случайное число от 1 до 10

4. Удалите все элементы из списка, созданного в задании 3

5. Создайте список из введенной пользователем строки и удалите из него символы ‘a’, ‘e’, ‘o’

6. Даны два списка, удалите все элементы первого списка из второго

a = [1, 3, 4, 5]

b = [4, 5, 6, 7]

# Вывод

>>> [6, 7]

7. Создайте список из случайных чисел и найдите наибольший элемент в нем.

8. Найдите наименьший элемент в списке из задания 7

9. Найдите сумму элементов списка из задания 7

10.Найдите среднее арифметическое элементов списка из задания 7

Сложные задачи

1. Создайте список из случайных чисел. Найдите номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).

2. Создайте список из случайных чисел. Найдите максимальное количество его одинаковых элементов.

3. Создайте список из случайных чисел. Найдите второй максимум.

a = [1, 2, 3] # Первый максимум == 3, второй == 2

4. Создайте список из случайных чисел. Найдите количество различных элементов в нем.

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

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

my_list = [1, 2, 3, 4, 5]

Список может выглядеть так:

my_list = ['один', 'два', 'три', 'четыре', 'пять']

Можно смешивать типы содержимого:

my_list = ['один', 10, 2.25, [5, 15], 'пять']

Поддерживаются вложенные списки как в примере выше.

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

third_elem  =  my_list[2]

Принцип похож на строки.

Изменение списка

Списки — это изменяемые объекты, поэтому их элементы могут изменяться, или же может меняться их порядок.

Если есть такой список:

my_list = ['один', 'два', 'три', 'четыре', 'пять']

То его третий элемент можно изменить следующим образом:

my_list[2]  =  'ноль'

Если сейчас вывести его на экран, то он будет выглядеть вот так:

['один', 'два', 'ноль', 'четыре', 'пять']

Если индекс — отрицательное число, то он будет считаться с последнего элемента.

my_list = ['один', 'два', 'три', 'четыре', 'пять']
elem  =  my_list[-1]
print(elem)

Вывод этого кода — ‘пять’.

Проход (итерация) по списку

Читать элементы списка можно с помощью следующего цикла:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
for elem in my_list:
    print(elem)

Таким образом можно читать элементы списка. А вот что касается их обновления:

my_list = [1, 2, 3, 4, 5]
for i in range(len(my_list)):
    my_list[i]+=5
    print(my_list)

Результат будет следующим:

[6, 7, 8, 9, 10]

Функция len() используется для возврата количества элементов, а range() — списка индексов.

Стоит запомнить, что вложенный список — это всегда один элемент вне зависимости от количества его элементов.

my_list = ['один', 10, 2.25, [5, 15], 'пять']
print(len(my_list))

Результат кода выше — 5.

Срез списка

Можно получить срез списка с помощью оператора (:):

my_list = ['один', 'два', 'три', 'четыре', 'пять']
print(my_list[1:3])

Результат кода выше — ['два', 'три']

Если убрать первое число, от срез будет начинаться с первого элемента, а если второе — с последнего.

Если убрать числа и оставить только двоеточие, то скопируется весь список.

my_list = ['один', 'два', 'три', 'четыре', 'пять']
print(my_list[1:3])
print(my_list[1:])
print(my_list[:3])
print(my_list[:])

Результат этого года:

['два', 'три']
['два', 'три', 'четыре', 'пять']
['один', 'два', 'три']
['один', 'два', 'три', 'четыре', 'пять']

Поскольку списки изменяемые, менять элементы можно с помощью оператора среза:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
my_list[1:3]  =  ['Привет',  'Мир']
print(my_list)

Результат:

['один', 'Привет', 'Мир', 'четыре', 'пять']

Вставить в список

Метод insert можно использовать, чтобы вставить элемент в список:

my_list = [1, 2, 3, 4, 5]
my_list.insert(1,'Привет')
print(my_list)

Результат:

[1, 'Привет', 2, 3, 4, 5]

Индексы для вставляемых элементов также начинаются с нуля.

Добавить в список

Метод append можно использовать для добавления элемента в список:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
my_list.append('ещё один')
print(my_list)

Результат:

['один', 'два', 'три', 'четыре', 'пять', 'ещё один']

Можно добавить и больше одного элемента таким способом:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
list_2  =  ['шесть',  'семь']
my_list.extend(list_2)
print(my_list)

Результат:

['один', 'два', 'три', 'четыре', 'пять', 'шесть',  'семь']

При этом list_2 не поменяется.

Отсортировать список

Для сортировки списка нужно использовать метод sort.

my_list = ['cde', 'fgh', 'abc', 'klm', 'opq']
list_2 = [3, 5, 2, 4, 1]
my_list.sort()
list_2.sort()
print(my_list)
print(list_2)

Вывод:

['abc', 'cde', 'fgh', 'klm', 'opq']
[1, 2, 3, 4, 5]

Перевернуть список

Можно развернуть порядок элементов в списке с помощью метода reverse:

my_list = [1, 2, 3, 4, 5]
my_list.reverse()
print(my_list)

Результат:

[5, 4, 3, 2, 1]

Индекс элемента

Метод index можно использовать для получения индекса элемента:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
print(my_list.index('два'))

Результат 1.

Если в списке больше одного такого же элемента, функция вернет индекс первого.

Удалить элемент

Удалить элемент можно, написав его индекс в методе pop:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
removed = my_list.pop(2)
print(my_list)
print(removed)

Результат:

['один', 'два', 'четыре', 'пять']
три

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

my_list = ['один', 'два', 'три', 'четыре', 'пять']
removed = my_list.pop()
print(my_list)
print(removed)

Результат:

['один', 'два', 'три', 'четыре']
пять

Элемент можно удалить с помощью метода remove.

my_list = ['один', 'два', 'три', 'четыре', 'пять']
my_list.remove('два')
print(my_list)

Результат:

['один', 'три', 'четыре', 'пять']

Оператор del можно использовать для тех же целей:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
del my_list[2]
print(my_list)

Результат:

['один', 'два', 'четыре', 'пять']

Можно удалить несколько элементов с помощью оператора среза:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
del my_list[1:3]
print(my_list)

Результат:

['один', 'четыре', 'пять']

Функции агрегации

В Python есть некоторые агрегатные функции:

my_list = [5, 3, 2, 4, 1]
print(len(my_list))
print(min(my_list))
print(max(my_list))
print(sum(my_list))

sum() работает только с числовыми значениями.

А max(), len() и другие можно использовать и со строками.

Сравнить списки

В Python 2 сравнить элементы двух списком можно с помощью функции cmp:

my_list = ['один', 'два', 'три', 'четыре', 'пять']
list_2 = ['три', 'один', 'пять', 'два', 'четыре']
print(cmp(my_list,list_2))

Она вернет -1, если списки не совпадают, и 1 в противном случае.

В Python 3 для этого используется оператор (==):

my_list = ['один', 'два', 'три', 'четыре', 'пять']
list_2 = ['три', 'один', 'пять', 'два', 'четыре']
if (my_list == list_2):
    print('cовпадают')
else:
    print('не совпадают')

Результат не совпадают.

Математические операции на списках:

Для объединения списков можно использовать оператор (+):

list_1 = [1, 2, 3]
list_2 = [4, 5, 6]
print(list_1 + list_2)

Результат:

[1, 2, 3, 4, 5, 6]

Список можно повторить с помощью оператора умножения:

list_1 = [1, 2, 3]
print(list_1  *  2)

Результат:

[1, 2, 3, 1, 2, 3]

Списки и строки

Для конвертации строки в набор символов, можно использовать функцию list:

my_str = 'Monty Python'
my_list = list(my_str)
print(my_list)

Результат:

['M', 'o', 'n', 't', 'y', ' ', 'P', 'y', 't', 'h', 'o', 'n']

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

Можно использовать метод split для разбития строки на слова:

my_str = 'Monty Python'
my_list = my_str.split()
print(my_list)

Результат:

['Monty', 'Python']

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

Символом разбития может служить любой знак, а не только пробел.

my_str = 'Monty-Python'
my_list = my_str.split('-')
print(my_list)

Результат будет аналогичен:

['Monty', 'Python']

Объединить список в строку

Обратный процесс — объединение элементов списка в строку.

Это делается с помощью метода join:

my_list = ['Monty', 'Python']
delimiter = ' '
output = delimiter.join(my_list)
print(output)

Результат Monty Python.

Алиасинг (псевдонимы)

Когда две переменные ссылаются на один и тот же объект:

my_list = ['Monty', 'Python']
list_2 = my_list

Алиасинг значит, что на объект ссылается больше одного имени.

Следующий пример показывает, как меняются изменяемые списки:

my_list = ['Monty', 'Python']
list_2 = my_list
list_2[1] = 'Java:)'
print(my_list)

Результат:

['Monty', 'Java:)']

Изменился список list_2, но поскольку он ссылается на один и тот же объект, то оригинальный список тоже поменялся.
Использовать “псевдонимы” при работе со списками не рекомендуется.
В целом, работать со списками в Python очень просто.

Добавить комментарий