Коллекции данных

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

Python содержит следующие встроенные коллекции данных:
На этом занятии подробно рассмотрим коллекции: list, tuple, set, frozenset и dict:
l = [1, 2, 3, 4]         # Список (list)
t = (1, 2, 3, 4)         # Кортеж (tuple)
s = {1, 2, 3, 4}         # Множество (set)
f = {1, 2, 3, 4}         # Замороженное множество (frozenset)
d = {'one': 1, 'two': 2} # Словарь (dict)
На первый взгляд все коллекции очень похожи и отличаются, максимум скобками, в которые заключены объекты коллекции, но у каждой коллекции данных есть свое назначение и область в которой ее применение наиболее эффективно, рассмотрим все по порядку.
Последовательности
Python имеет 6 основных типов последовательностей:

  • str (строка)
  • list (список)
  • tuple (кортеж)
  • bytes (байтовые строки)
  • bytearray(массив байт)
Все последовательности обладают рядом общих свойств:

  • Индексы начинаются с 0;
  • Строгий порядок элементов;
  • Обход всех элементов в цикле, т.е итерирование;
  • Обращение к элементу по индексу;
  • Разнородность - элементом последовательности может быть объект любого типа;
  • Произвольное число уровней вложенности;
  • Поддерживают оператор членства in;
  • Поддерживают оператор извлечения срезов [ ];
  • Поддержка функций len, max, min;

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

Простой пример итерирования:
colors = ('white', 'blue', 'orange')
print(f'Элементы кортежа: {colors}')
for color in colors: # итерирование
    print(color)
text = 'abcd!@#%'
print(f'Символы строки: "{text}"')
for char in text: # итерирование
    print(char)
Получение элемента по индексу
Все последовательности позволяют обращаться к их элементам по "порядковым номерам", т.е по индексу. Нумерация индексов начинается с нуля. Если мы хотим обращаться к элементам начиная с конца последовательности, мы можем использовать отрицательное индексирование.

Пример как работает отрицательное индексирование:
Т.е. Если мы хотим обратить к последнему элементу, то можно использовать индекс -1, если к предпоследнему, то -2, и т.д.

При попытке обратиться по несуществующему индексу списка вы получите исключение IndexError. Подробно рассмотрим на конкретных структурах данных, сейчас простой пример:
colors = ('white', 'blue', 'orange')
first_color = colors[0]
last_color = colors[-1] # или colors[2]
print('Первый цвет: ', first_color)
print('Последний цвет: ', last_color)
Срезы (slice)
Операция среза [ ] применима только к последовательностям и позволяет манипулировать ее частями, создавать, изменять, удалять и копировать. Структура оператора среза (slice):

< последовательность >[<индекс начала> : <индекс конца> : <шаг>]

  • <индекс начала> - целое число, если не указывать, то будет взят первый индекс последовательности, можно указывать отрицательный индекс;
  • <индекс конца> - целое число, если не указывать, то будет взят последний индекс последовательности, можно указывать отрицательный индекс;
  • <шаг> - целое число, необязательный аргумент, по умолчанию равен одному. Можно использовать отрицательное значение.
Подробно рассмотрим на конкретных структурах данных, сейчас простой пример:

colors = ('white', 'blue', 'orange')
two_colors = colors[:2]
print(f'Перввые два цвета: {two_colors}')