Обхід словників
Словники можна обходити циклом 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
>>>