Поряд зі списками і кортежами Python має ще одну вбудовану структуру даних, яка називається словник (dictionary). У ряді мов програмування є схожі структури (словник в C#, асоціативний масив в PHP).
Як і список, словник зберігає колекцію елементів. Кожен елемент в словнику має унікальний ключ, з яким асоційовано деяке значення.
Визначення словника має наступний синтаксис:
dictionary = { ключ1:значення1, ключ2:значення2, ....}
Визначимо пару словників:
users = {1: "Tom", 2: "Bob", 3: "Bill"} elements = {"Au": "Золото", "Fe": "Залізо", "H": "Водень", "O": "Кисень"}
У словнику users в якості ключів використовуються числа, а в якості значень - рядки. У словнику element в якості ключів використовуються рядки.
Але необов'язково ключі і рядки повинні бути однотипними. Вони можуть представляти різні типи:
objects = {1: "Tom", "2": True, 3: 100.6}
Ми можемо також взагалі визначити порожній словник без елементів:
objects = {} #або так: objects = dict()
Перетворення зі списку в словник
Незважаючи на те, що словник і список - несхожі за структурою типи, але тим не менше існує можливості для окремих видів списків, перетворення їх в словник з допомогою вбудованої функції dict(). Для цього список повинен зберігати набір вкладених списків. Кожен вкладений список повинен складатися з двох елементів - при конвертації в словник перший елемент стане ключем, а другий - значенням:
users_list = [ ["+111123455", "Tom"], ["+384767557", "Bob"], ["+958758767", "Alice"] ] users_dict = dict(users_list) print(users_dict) # {"+111123455": "Tom", "+384767557": "Bob", "+958758767": "Alice"}
Подібним чином можна перетворити в словник двомірні кортежі, які в свою чергу містити кортежі з двох елементів:
users_tuple = ( ("+111123455", "Tom"), ("+384767557", "Bob"), ("+958758767", "Alice") ) users_dict = dict(users_tuple) print(users_dict)
Отримання та зміна елементів
Для доступу до елементів словника необхідно використовувати ключ:
dictionary[ключ]
Наприклад, отримаємо і змінимо елементи в словнику:
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } # отримуємо елемент з ключем "+11111111" print(users["+11111111"]) # Tom # установка значення елемента з ключем "+33333333" users["+33333333"] = "Bob Smith" print(users["+33333333"]) # Bob Smith
Якщо при установки значення елемента з таким ключем в словнику не виявиться, то відбудеться його додавання:
users["+4444444"] = "Sam"
Але якщо ми спробуємо отримати значення з ключем, якого немає в словнику, то Python згенерує помилку KeyError:
user = users["+4444444"] # KeyError
І щоб попередити цю ситуацію перед зверненням до елемента ми можемо перевіряти наявність ключа в словнику за допомогою виразу ключ in словник. Якщо ключ є в словнику, то даний вираз повертає True:
key = "+4444444" if key in users: user = users[key] print(user) else: print("Елемент не знайдено")
Також для отримання елементів можна використовувати метод get, який має дві форми:
- get (key): повертає з словника елемент з ключем key. Якщо елемента з таким ключем немає, то повертає значення None
- get (key, default): повертає з словника елемент з ключем key. Якщо елемента з таким ключем немає, то повертає значення за замовчуванням default
key = "+55555555" user = users.get(key) user = users.get(key, "Unknown user")
Видалення
Для видалення елемента по ключу застосовується оператор del:
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } del users["+55555555"] print(users)
Але варто враховувати, що якщо подібного ключа не виявиться в словнику, то буде викинуто виняток KeyError. Тому знову ж перед видаленням бажано перевіряти наявність елемента з даним ключем.
key = "+55555555" if key in users: user = users[key] del users[key] print (user, " видалено") else: print("Елемент не знайдено")
Інший спосіб видалення представляє метод pop(). Він має дві форми:
- pop (key): видаляє елемент за ключем key і повертає видалений елемент. Якщо елемент з даним ключем відсутній, то генерується виняток KeyError
- pop (key, default): видаляє елемент за ключем key і повертає видалений елемент. Якщо елемент з даним ключем відсутній, то повертається значення default
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } key = "+55555555" user = users.pop(key) print(user) user = users.pop("+4444444", "Unknown user") print(user)
Якщо необхідно видалити всі елементи, то в цьому випадку можна скористатися методом clear():
users.clear()
Копіювання та об'єднання словників
Метод copy() копіює вміст словника, повертаючи новий словник:
users = {"+1111111": "Tom","+3333333": "Bob","+5555555": "Alice"} users2 = users.copy()
Метод update() об'єднує два словника:
users = {"+1111111": "Tom","+3333333": "Bob","+5555555": "Alice"} users2 = {"+2222222": "Sam","+6666666": "Kate"} users.update(users2) print(users) # {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice", "+2222222": "Sam", "+6666666": "Kate"} print(users2) # {"+2222222": "Sam", "+6666666": "Kate"}
При цьому словник users2 залишається без змін. Змінюється словник users, в який додаються елементи іншого словника. Але якщо необхідно, щоб обидва вихідних словника були без змін, а результатом об'єднання був якийсь третій словник, то можна попередньо скопіювати один словника в іншій:
users3 = users.copy() users3.update(users2)
Перебір словника
Для перебору словника можна скористатися циклом for:
users = { "+11111111": "Tom", "+33333333": "Bob", "+55555555": "Alice" } for key in users: print(key, " - ", users[key])
При переборі елементів ми отримуємо ключ поточного елемента і по ньому можемо отримати сам елемент.
Інший спосіб перебору елементів представляє використання методу items():
for key, value in users.items(): print(key, " - ", value)
Метод items() повертає набір кортежів. Кожен кортеж містить ключ і значення елемента, які при переборі ми можемо отримати в змінні key і value.
Також існують окремо можливості перебору ключів і перебору значень. Для перебору ключів ми можемо викликати у словника метод keys():
for key in users.keys(): print(key)
Правда, цей спосіб перебору не має сенсу, так як і без виклику методу keys() ми можемо перебрати ключі, як було показано вище.
Для перебору тільки значень ми можемо викликати у словника метод values():
for value in users.values(): print(value)
Комплексні словники
Крім найпростіших об'єктів типу чисел і рядків словники також можуть зберігати і більш складні об'єкти - ті ж списки, кортежі або інші словники:
users = { "Tom": { "phone": "+971478745", "email": "tom12@gmail.com" }, "Bob": { "phone": "+876390444", "email": "bob@gmail.com", "skype": "bob123" } }
В даному випадку значення кожного елемента словника в свою чергу представляє окремий словник.
Для звернення до елементів вкладеного словника відповідно необхідно використовувати два ключа:
old_email = users["Tom"]["email"] users["Tom"]["email"] = "supertom@gmail.com"
Але якщо ми спробуємо отримати значення за ключем, який відсутній у словнику, Python генерує виняток KeyError:
tom_skype = users["Tom"]["skype"] # KeyError
Щоб уникнути помилки, можна перевіряти наявність ключа в словнику:
key = "skype" if key in users["Tom"]: print(users["Tom"]["skype"]) else: print("skype is not found")
У всьому іншому робота з комплексними і вкладеними словниками аналогічна роботі зі звичайними словниками.