Треки
/
Python
Python
/
Салабус
/
Словники
Сл

Словники у Python

37 вправ

Про концепцію Словники

Словник (dict) у Python - це структура даних, яка зіставляє хешовані ключі зі значеннями, а в інших мовах програмування його знають як хеш-таблицю зі змінним розміром, хешмапу або асоціативний масив. Словники - єдиний вбудований тип відображення у Python.

keys мають бути хешованими та унікальними в межах словника. Ключами можуть бути number, str або tuple (зі незмінних значень). Вони не можуть містити змінювані структури даних, як-от list, dict або set. Починаючи з Python 3.7, порядок ключів у dict гарантовано збігається з порядком, у якому додають записи.

values можуть мати будь-який тип даних чи структуру. Значення також можуть вкладатися довільно, тож вони можуть містити списки списків, підсловники та інші власні чи складені структури даних.

Маючи key, словник може дістати value за (в середньому) сталий час (незалежно від кількості записів). Порівняно з пошуком значення в list або array (без знання позиції index), dict використовує значно більше памʼяті, але дістає значення дуже швидко.

Словники особливо корисні, коли набір елементів великий і до нього часто треба звертатися й оновлювати його.

Створення словника

Словники можна створювати багатьма різними способами, зокрема:

  • за допомогою методу класу fromkeys();
  • за допомогою словникових включень;
  • обʼєднанням двох словників через розпакування (**);
  • обʼєднанням словників оператором | (оновлення);
  • за допомогою циклу, який додає записи до раніше створеного порожнього dict.

Два найпростіші способи - це конструктор словника та словниковий літерал.

Конструктор словника

dict() (конструктор класу dict) можна застосувати до будь-якого ітерованого набору пар key, value. Його також можна викликати з низкою аргументів <name>=<value>:

# Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),
...              ('speed', 23),
...              ('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Using key=value arguments.
>>> bear = dict(name="Black Bear",
...             speed=40,
...             land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}

Документація про dict описує додаткові варіанти та можливості використання конструктора.

Словникові літерали

Словник можна також записати безпосередньо як словниковий літерал, використавши фігурні дужки ({}) навколо пар key : value. Записи всередині {} можуть стояти й на окремих рядках:

>>> whale = {"name": "Blue Whale", 
             "speed": 35, 
             "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle'}

>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'color': 'Brindle'}

Вкладені словники

Словники можна вкладати довільно:

animals = {
    "Real" : {
        "Winged" : {
            "Sparrow" : {'name': 'sparrow','speed': 12, 'land_animal': True},
            "Kestrel" : {'name': 'kestrel', 'speed': 15, 'land_animal': True}
           },
        "Legged" : {
            "Wombat" : {'name': 'Wombat', 'speed': 23, 'land_animal': True},
            "Black Bear": {'name': 'Black Bear', 'speed': 40, 'land_animal': True},
            "Polecat" : {'name': 'Polecat', 'speed': 15, 'land_animal': True}
           },
        "Other" :  {
            "Whale" : {'name': 'Blue Whale', 'speed': 35, 'land_animal': False},
            "Orca" : {'name': 'Orca', 'speed': 45, 'land_animal': False},
            "Snake" : {'name': 'Python', 'speed': 25, 'land_animal': True}
            }
        },
        
    "Imaginary": {
        "Winged" : {
            "Dragon" : {'name': 'Fire Dragon','speed': 100, 'land_animal': True},
            "Phoenix" : {'name': 'Phoenix', 'speed': 1500, 'land_animal': True}
            },
        "Legged" : {
            "Sphinx" : {'name': 'Sphinx','speed': 10, 'land_animal': True},
            "Minotaur" : {'name': 'Minotaur', 'speed': 5, 'land_animal': True}
            },
        "Other" :  {}
        }
   }

Доступ до значень у dict

Дістати value зі словника можна за ключем у квадратних дужках. Якщо ключа немає у словнику, виникає KeyError:

>>> bear["speed"]
40

>>> bear["color"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'color'

Звернення до запису через метод get(<key>, <default value>) дає змогу уникнути KeyError:

>>> bear.get("color", 'not found')
'not found'

Доступ до вкладених записів словника

Щоб дістатися записів у вкладених словниках, використовуємо дужки одну за одною. Якщо якогось ключа немає, виникає звичайний KeyError:

# Using the animals nested dictionary.
>>> animals["Real"]["winged"]["Kestrel"]["speed"]
15

>>> animals["Imaginary"]["winged"]["Kestrel"]["speed"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Kestrel'

Щоб уникнути KeyError, можна скористатися .get(), але виклики .get() треба зчіплювати:

# Using the animals nested dictionary.
# Note the use of parenthesis to enable placing the 
# .get() calls on separate lines.
>>> (animals.get("Imaginary", {})
            .get("Legged", {})
            .get("Sphinx", {})
            .get("Color", "I have no idea!"))
'I have no idea!'

Зміна та додавання значень словника

Змінити value запису можна присвоєнням за його ключем:

# Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}

>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}

Нові пари key:value можна додати так само:

# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}

>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}

Видалення записів словника (pop і del)

Щоб видалити запис зі словника, використовуємо метод <dict>.pop(<key>). <dict>.pop() прибирає пару (key, value) і повертає value, яке можна використати далі. Як і <dict>.get(), <dict>.pop(<key>) приймає другий аргумент (<dict>.pop(<key>, <default value>)), який буде повернено, якщо key не знайдено. Це запобігає виникненню KeyError:

# Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'


# The "name" key is now removed from the dictionary.
# Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'


# Using a default argument with .pop() will 
# prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'

Також можна скористатися інструкцією del, щоб видалити один або кілька записів. Якщо запису, який треба видалити, немає у словнику, виникає KeyError:

>>> wombat = {'name': 'Wombat',
              'speed': 23,
              'land_animal': True,
              'color': 'Brindle',
              'talent': 'Singing',
              'size': 'small'}

# Remove a single entry from the dictionary.
>>> del wombat["color"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True, 'talent': 'Singing', 'size': 'small'}


# Remove multiple entries from the dictionary.
>>> del wombat["talent"], wombat["size"]
>>> wombat
{'name': 'Wombat', 'speed': 23, 'land_animal': True}


# Attempting a deletion of a non-existent key raises a KeyError
>>> del wombat["number_of_legs"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'number_of_legs'

Перебирання словника циклом

Перебираючи словник через for item in dict чи while item, ми типово перебираємо ключі. Значення в тому самому циклі можна дістати через квадратні дужки:

>>> for key in bear:
...     print((key, bear[key])) # <--This prints a tuple of (key, value).
('name', 'Black Bear')
('speed', 40)
('land_animal', True)

Можна також скористатися методом .items(), який повертає кортежі (key, value):

# dict.items() forms (key, value tuples) that can be 
# unpacked and iterated over.
>>> for key, value in whale.items():
...     print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1

Так само .keys() повертає keys, а .values() повертає values.

Щоб докладно розібратися зі словниками в Python, почати варто з офіційної документації, а також можна зазирнути до туторіалу W3-Schools.

Розширення можливостей словника: модуль collections

Модуль collections додає спеціалізовані можливості до стандартних колекційних типів даних Python (dict, set, list, tuple). Три найкорисніші класи, побудовані на словниках:

  • Counter автоматично підраховує елементи й повертає їх у dict, де елементи є ключами, а їхні лічильники - значеннями.
  • OrderedDict має методи, призначені для впорядкування записів словника.
  • defaultdict використовує фабричний метод, щоб задати типове значення, якщо key не знайдено під час спроби дістати чи присвоїти запис словника.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Словники

Практика заблокована

Розблокуйте ще 4 вправи, щоб практикувати концепцію Словники