Перейти к содержанию

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]

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

x = [1, 2, 3]

print(x[10])  # Вызовет ошибку IndexError: list index out of range

Перед доступом к элементам списка проверяйте его размер

Перед тем, как запросить элемент с индексом i, проверяйте что в есть списке как минимум i + 1 элемент.

if i < len(x):
    print(x[i])

При этом, списки в 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 также могут быть

  • отрицательными

    x = [11, 22, 33, 44, 55]
    
    print(x[1:-1])  # напечатает [22, 33, 44]
    print(x[-1:1])  # напечатает []
    print(x[-3:-1])  # напечатает [33,44]
    

  • и даже пустыми

    x = [11, 22, 33, 44, 55]
    
    print(x[1:])  # напечатает [22, 33, 44]
    print(x[:3])  # напечатает [11, 22, 33]  
    print(x[:])  # напечатает [11, 22, 33, 44, 55]
    

Срезы - это копирование элементов списка

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

x = [1, 2, 3, 4, 5]
y = [:]

x[0] = 11  # заменяем первый элемент в списке x

print(x)  # напечатает [11, 2, 3, 4, 5]
print(y)  # напечатает [1, 2, 3, 4, 5]
При обработке данных, это может вызвать дополнительную нагрузку на оперативную память.

Операции

len(x)
Вычисление количества элементов в списке.
x = [1, 2, 3, 4, 5]
print(x)  # напечатает 5
x.append(e)
Добавление элемента e в список.
x = [1, 2, 3, 4]
x.append(5)

print(x)  # напечатает [1, 2, 3, 4, 5]
x.extend(y)
Расширение списка x списком y. Все элементы из списка y добавляются в конец с сохранением порядка.
x = [1, 2, 3]
y = [4, 5]
x.extend(y)

print(x)  # напечатает [1, 2, 3, 4, 5]
x + y
Аналог x.extend(y).
print([1, 2, 3] + [4, 5])  # напечатает [1, 2, 3, 4, 5]
x.index(e)
Возвращает индекс элемента e в списке. Если элемента в списке нет, то возвращается ошибка ValueError. Помним, что индексация элементов списка начинатся с 0.
x = ['1', '2', '3', '4', '5']

print(x.index('2'))  # напечатает 1
print(x.index('22'))  # ошибка ValueError: '22' is not in list 
x.insert(i, e)
Вставка элемента e в списке на позицию i.
x = ['1', '3', '4', '5']
x.insert(1, '2')

print(x)  # напечатает ['1', '2', '3', '4', '5']
del x[i]
Удаление из списка элемента в позиции i.
x = ['1', '2', '3', '4', '5']
del x[1]

print(x)  # напечатает ['1', '3', '4', '5']
e in x
Проверка наличия элемента e в списке x. Возвращает булево значение (True или False).
x = ['1', '2', '3', '4', '5']

print('2' in x)  # напечатает True
print('22' in x)  # напечатает False
x.sort()
Сортировка списка по возрастанию. Если указан параметр reverse=True, то по убыванию.
x = [4, 1, 3, 2, 5]
x.sort()

print(x)  # напечатает [1, 2, 3, 4, 5]

x.sort(reverse=True)

print(x)  # напечатает [5, 4, 3, 2, 1]

Больше про операции над списками в официальной документации

Кортежи

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

<!-- Кортеж - это аналог неизменяемого списка. К нему нельзя добавлять/удалять элементы, а также менять внутренние элементы. Как и в случае списков, в одном кортеже могут храниться элементы разных типов

x1 = (1, 2, 3)

x2 = ('1', 'Строка 1', True)
``` -->

## Словари

!!! note "Скоро появится"

## Множества

!!! note "Скоро появится"

## Комплексные коллекции

Часто возникает необходимость создавать комплексные коллекции. Например, список словарей.

```python
x = [{'a': 1, 'b': 22}, {'a': 33, 'b': 1}]

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

x.sort(key=lambda e: e['b'])

print(x)  # напечатает [{'a': 33, 'b': 1}, {'a': 1, 'b': 22}]

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

x = [(1, 22), (33, 1)]

# сортируем по убыванию первого элемента
x.sort(key=lambda e: e[0], reverse=True)  

print(x)  # напечатает [(33, 1), (1, 22)]

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

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

Другие типы коллекций

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

Особенно полезны из них:

  • OrderedDict - это как словарь, только с сохранением порядка, в котором добавлялись ключи.
  • deque - позволяют реализовать работу стеком и очередью.