Python: списки, словари, кортежи, множества.
Познакомимся со встроенными типами данных для работы с коллекциями значений:
list
- список;tuple
- кортеж;dict
- словарь;set
- множество.
Списки
Список в Python - это упорядоченный и проиндексированный набор элементов, аналог массивов. Элементами списка могут быть значения любого типа. В том числе, в одном списке могут храниться значения разных типов.
x1 = [1, 2, 3]
x2 = ['Строка 1', 'Строка 2', 'Строка 3']
x3 = [[1, 2, 3], ['Строка 1', 'Строка 2', 'Строка 3'], [True, False, None]]
x4 = [1, 'Строка 1', True]
Обращение к элементам списка
Обращение к элементу списка происходит через оператор индексирования [i]
, здесь i
- это целое число. Применение такого оператора возвращает элемент списка, расположенный на указанноё позиции. Индексация начинается с нуля, т.е. самый первый элемент в списке имеет индекс 0.
print(x1[0]) # напечатает 1
print(x2[1]) # напечатает 'Строка 2'
print(x3[2]) # напечатает [True, False, None]
Попытка обращения к элементу по несуществующему индексу вызовет ошибку.
Перед доступом к элементам списка проверяйте его размер
Перед тем, как запросить элемент с индексом i
, проверяйте что в есть списке как минимум i + 1
элемент.
При этом, списки в Python допускают "отрицательную" индексацию: [-1]
- это последний элемент, x[-2]
- предпоследний и т.д.
print(x1[-1]) # напечатает 3
print(x2[-2]) # напечатает 'Строка 2'
print(x3[-3]) # напечатает [1, 2, 3]
print(x4[-4]) # вызовет ошибку IndexError: list index out of range
Срезы
Из списка можно доставать под-списки c последовательными индексами. Эта операция и получаемый в результате объект называется срезом (slice).
Для получения среза к списку нужно применить операцию [i:j]
- означает "вернуть элементы c индексами от i
(включительно) до j
(не включительно)".
x = [11, 22, 33, 44, 55]
print(x[2:4]) # напечатает [33, 44]
print(x[2:4]) # напечатает [33]
print(x[2:2]) # напечатает []
print(x[2:1]) # напечатает []
print(x[2:10]) # напечатает [33, 44, 55]
Индексы i
и j
также могут быть
-
отрицательными
-
и даже пустыми
Срезы - это копирование элементов списка
При этом, получение срезов вызывает создание копии данных
При обработке данных, это может вызвать дополнительную нагрузку на оперативную память.Операции
len(x)
- Вычисление количества элементов в списке.
x.append(e)
- Добавление элемента
e
в список. x.extend(y)
- Расширение списка
x
спискомy
. Все элементы из спискаy
добавляются в конец с сохранением порядка. x + y
- Аналог
x.extend(y)
. x.index(e)
- Возвращает индекс элемента
e
в списке. Если элемента в списке нет, то возвращается ошибкаValueError
. Помним, что индексация элементов списка начинатся с 0. x.insert(i, e)
- Вставка элемента
e
в списке на позициюi
. del x[i]
- Удаление из списка элемента в позиции
i
. e in x
- Проверка наличия элемента
e
в спискеx
. Возвращает булево значение (True
илиFalse
). x.sort()
- Сортировка списка по возрастанию. Если указан параметр
reverse=True
, то по убыванию.
Больше про операции над списками в официальной документации
Кортежи
Скоро появится
<!-- Кортеж - это аналог неизменяемого списка. К нему нельзя добавлять/удалять элементы, а также менять внутренние элементы. Как и в случае списков, в одном кортеже могут храниться элементы разных типов
x1 = (1, 2, 3)
x2 = ('1', 'Строка 1', True)
``` -->
## Словари
!!! note "Скоро появится"
## Множества
!!! note "Скоро появится"
## Комплексные коллекции
Часто возникает необходимость создавать комплексные коллекции. Например, список словарей.
```python
x = [{'a': 1, 'b': 22}, {'a': 33, 'b': 1}]
При сортировке таких списков необходимо указывать ключ, по значению которого будут выстроены отсортированного списка. Для этого используются однострочные (lambda) функции.
При сортировке списка кортежей (или списка других списков), то ключ указывается аналогично.
x = [(1, 22), (33, 1)]
# сортируем по убыванию первого элемента
x.sort(key=lambda e: e[0], reverse=True)
print(x) # напечатает [(33, 1), (1, 22)]
Генераторы списков и словарей
Скоро появится
Другие типы коллекций
Кроме указанных выше типов, стандартная библиотека Python содержит ещё некоторое количество структур для хранения коллекций значений.
Особенно полезны из них:
- OrderedDict - это как словарь, только с сохранением порядка, в котором добавлялись ключи.
- deque - позволяют реализовать работу стеком и очередью.