Структури даних

Контейнерами у комп’ютерній науці називають класи, структури даних та інші типи даних, які можуть містити у собі колекції деяких елементів. У реальному житті це: ящики, сумки, банки та інше. Навіть стопки тарілок є контейнерами, адже містять декілька елементів — тарілок.

Окрім класів, контейнерами є структури даних — спосіб організації даних разом з набором доступних над нами операцій. До основних структур даних у Python належать: списки, кортежі, множини і словники.

Впорядкованість структури даних визначає, чи знаходяться її елементи у певному визначеному порядку, чи у довільному розташуванні.

Мутабільність (змінність) описує, чи може певний об’єкт змінювати свої характеристики. Немутабільні типи можна порівняти з константами — їх значення (та властивості) залишаються однаковими за будь-яких умов. Втім, слід розуміти, що у багатьох випадках можна видалити немутабільний елемент і створити новий, з аналогічними, але зміненими властивостями.

Індексованими є структури даних, у яких кожен впорядкований елемент має індекс. Найчастіше це ціле число. Якщо “індексом” є не число, можна називати це скоріше ключем.

Список

Списки (lists) у Пайтоні є впорядкованими мутабільними індексованими структурами даних. Вони також можуть мати однакові елементи у кількох екземплярах. Елементи записують у квадратних дужках через кому.

aList = ["cat", "dog", "pheasant", "cat", "vole"]

Для доступу до елементів списку можна використовувати числові індекси, теж починаючи з 0. Також, у Python можна використовувати від’ємні індекси (звичайно, -0 не можна, тому починаючи з -1) для доступу до елементів з кінця.

aList[1] # dog
aList[-1] # vole

Розшарування (зріз)

У Python існує операція розшарування, яка дозволяє отримати зріз списку — його частину від одного до іншого індексів як новий список. Так само, як у range, початковий індекс включний, а кінцевий береться виключно. Використовується для цього двокрапка.

Будь-яке із значень можна пропустити. Від’ємні індекси дозволяються за однієї умови. Важливо: ця операція працює лише зліва направо, тому якщо кінцевий індекс буде меншим, ніж початковий, буде повернено порожній список!

aList[1:3] # ["dog", "pheasant"]
aList[-4:-1] # ["dog", "pheasant", "cat"]
aList[3:] # ["cat", "vole"]

Тим не менш, є спосіб зробити обернений зріз — справа наліво. Для цього можна вказати крок -1 як 3-й аргумент. Це, до речі, один із способів отримати обернений список: залишити порожніми початковий та кінцевий індекси, а кроком -1 пройтись у зворотньому порядку. Безумовно, крок може бути й іншим довільним числом.

aList[-1:-4:-1] # ["vole", "cat", "pheasant"]
aList[::-1] # ["vole", "cat", "pheasant", "dog", "cat"]

Методи роботи з елементами

Для знаходження довжини списку є метод len(<список>): len(aList) # 5.

Якщо потрібно вставити елемент за довільним індексом, зсуваючи решту елементів праворуч від нього, можна використати insert(<індекс>, <значення>): aList.insert(2, "mouse").

Для додавання елементу в кінець, є append(<елемент>): aList.append("dog").

Видалення за індексом через pop(<індекс>), а видалення конкретного значення за допомогою remove(<значення>): aList.remove("vole"), aList.pop(2).

Сортування за зростанням — sort(): aList.sort(); за спаданням — sort(reverse=True): aList.sort(reverse = True). Навіщо в аргументах знак “дорівнює” буде розказано у розділі про функції :)

Створити копію списку — copy(): aList.copy(). У першому розділі Основ було сказано, що звичайне присвоювання створило б просто посилання, тому для копіювання масиву потрібен окремий метод.

Порахувати кількість певного елементу можна за допомогою count(<елемент>): aList.count("cat").

Кортеж

Кортежі (tuples) є впорядкованими немутабільними індексованими структурами даних, що дозволяють дублікатні значення. Уявити їх можна фактично як незмінні масиви, а замість квадратних дужок у них круглі.

aTuple = ("cat", "dog", "pheasant", "cat", "vole")

Функція довжини len(), як Ви могли помітити, є окремою вбудованою функцією, а не методом списків, тому є універсальною для багатьох типів даних. Більшість операцій з кортежами аналогічні тому, як виконувались зі списками, однак пам’ятайте, що додавати та змінювати елементи кортежів не можна.

Множина

Множини (sets) — це невпорядковані немутабільні структури даних, що не дозволяють декілька копій однакових значень. Записуюють у фігурних дужках. Враховуйте, що True та 1 вважаються однаковими у множинах, як і False та 0, тому булеві значення не будуть додані на користь чисел.

aSet = {"cat", "dog", "pheasant", "cat", "vole"}

Так як цей тип не є індексованим, то з елементами можна виконувати лише дві операції: ітерацію (наприклад, циклом for) та перевірку на наявність елемента оператором in.

Втім, можна додавати нові елементи до множини методом add(<елемент>): aSet.add("badger").

Для видалення елементів є два методи, remove та discard. Перший виведе помилку, якщо елемента не було у множині, а другий ні. aSet.remove("cat"), aSet.discard("turtle")

Математичні операції

Так як множини є математичним поняттям, то до них можна застосовувати математичні операції з множинами.

svitppt.com.ua

У Python ці операції є методами з відповідними назвами англійською. Вони повертають нові множини, що є об’єднанням a.union(b), різницею a.difference(b) або перетином a.intersection(b) множин a і b відповідно.

Словники

Останнім із базових чотирьох типів є словники (dictionaries). Це особливий тип даних, який дозволяє зберігати елементи у вигляді пар “ключ-значення”. Спрощено, це як списки, у яких замість напередвизначених індексів можуть бути будь-які із базових значень. Якщо Ви зустрічались з форматом файлів JSON — словники це його втілення у Пайтоні. Словники зручні для зберігання підрахунку об’єктів або для ієрархічних структур даних.

Записують словник у фігурних дужках, вказуючи елементи у вигляді <ключ>:<значення> через коми. Писати можна як у рядок, так і у кілька рядків для зручності читання.

aDict = {
    "яблук": 8,
    "груш": 5,
    "апельсинів": 12
}

Доступ до значень здійснюється через квадратні дужки за ключем: aDict["груш"].

Можна отримати список ключів або значень окремо, наприклад, для роботи над словниками циклами: aDict.keys() та aDict.values() відповідно.

Оператор in перевіряє наявність ключа у словнику, а не значення. Методи pop(<ключ>) та copy() працюють і для словників теж.


Copyleft 🄯 2020–2024 Михайло Стецюк <yaBobJonez@gmail.com>.
Сайт має ліцензію Creative Commons License.
Дякую рідній школі та вчителям!