Перейти до змісту

Обхід словників

Словники можна обходити циклом for. Відбувається перебір ключів словника, отже циклом for фактично ми ітеруємось саме по ключам словника.

>>> d = {1:11, '2':'двадцять два', None: None}
>>> for key in d:
...     print(key, d[key])
...
1 11
2 двадцять два
None None
>>>

Зауважте: словник — структура невпорядкована. Тому при ітерації по словнику порядок ключів залишається випадковим.

keys()

Словник має метод keys(), за допомогою якого можна отримати усі ключі словника. Метод повертає об'єкт спеціального типу (класу) 'dict_keys' який містить усі ключі словника.

>>> d = {1:11, 2:22}
>>> keys = d.keys()
>>> keys
dict_keys([1, 2])
>>> type(keys)
<class 'dict_keys'>
>>>

Здається що dict_keys — це послідовність. Але це не так. Ми не можемо отримати доступ до довільного елемента за допомогою індексації:

>>> keys
dict_keys([1, 2])
>>> keys[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object is not subscriptable
>>>

Але dict_keys можна привести до послідовності, наприклад до списку:

>>> keys_list = list(keys)
>>> keys_list
[1, 2]
>>>

Також по dict_keys можна ітеруватись циклом for:

>>> for key in keys:
...     print(key)
...
1
2
>>>

values()

Ще один метод словника — values(). Повертає об'єкт класу 'dict_values' який містить усі значення словника.

>>> d
{1: 11, 2: 22}
>>> values = d.values()
>>> values
dict_values([11, 22])
>>> type(values)
<class 'dict_values'>
>>>

Щоб отримати послідовність усіх значень словника — можна привести наприклад до списку:

>>> values_list = list(values)
>>> values_list
[11, 22]
>>>

По об'єкту типу dict_values можна ітеруватись:

>>> for value in d.values():
...     print(value)
...
11
22
>>>

items()

Ще один метод словника — items(). Повертає об'єкт класу 'dict_items' який містить пари "ключ-значення". Кожна пара "ключ-значення" представлена кортежем, перший елемент кортежа — це ключ, другий — відповідне йому значення зі словника:

>>> d
{1: 11, 2: 22}
>>> items = d.items()
>>> items
dict_items([(1, 11), (2, 22)])
>>> type(items)
<class 'dict_items'>
>>>

Отримаємо список усіх пар словника:

>>> list(d.items())
[(1, 11), (2, 22)]
>>> list(d.items())[-1]
(2, 22)
>>>

Ітеруватись циклом for по елементам (парам) словника теж можна:

>>> for item in d.items():
...     print(item)
...
(1, 11)
(2, 22)
>>>

Зауважте: у змінну цикла for при черговій ітерації цикла попадає кортеж — ключ і відповідне значення словника.

>>> for item in d.items():
...     print(item[0], '-', item[1])
...
1 - 11
2 - 22
>>>

Перебір елементів словника циклом for — відносно часта операція. Але отримувати з кортежа ключ і відповідне значення за допомогою індексації — не дуже зрозуміло і зручно. Тому ми можемо якби "розкласти" кортеж на окремі складові прямо у заголовку цикла for. Просто замість однієї змінної цикла достатньо вказати дві. І тоді у першу змінну при черговій ітерації цикла буде попадати елемент кортежа з індексом 0, у другу — відповдно елемент кортежа з індексом 1.

>>> d
{1: 11, 2: 22}
>>> for key, value in d.items():
...     print(key, '-', value)
...
1 - 11
2 - 22
>>>