Словари Python

В Python словарь — это упорядоченная (начиная с Python > 3.7) коллекция пар ключ: значение.

Из документации Python 3

Основные операции со словарем — это сохранение значения с некоторым ключом и извлечение значения по заданному ключу. Также можно удалить пару ключ:значение с помощью del.

Пример словаря:

# Dictionary: collection of key-value pairs
my_cat = {
    'size': 'fat',          # key: 'size', value: 'fat'
    'color': 'gray',         # key: 'color', value: 'gray'
    'disposition': 'loud'    # key: 'disposition', value: 'loud'
}

Установка ключа, значения с помощью оператора подстроки []

# Add or update dictionary entry using subscript operator
my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
my_cat['age_years'] = 2  # Add new key-value pair
print(my_cat)
{'size': 'fat', 'color': 'gray', 'disposition': 'loud', 'age_years': 2}

Получение значения с помощью оператора подстроки []

В случае, если ключ не присутствует в словаре, вызывается исключение KeyError.

my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
print(my_cat['size'])
fat
print(my_cat['eye_color'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'eye_color'

values()

Метод values() получает значения словаря:

# Iterate over dictionary values using .values() method
pet = {'color': 'red', 'age': 42}
for value in pet.values():  # Loop through all values
    print(value)
red
42

keys()

Метод keys() получает ключи словаря:

# Iterate over dictionary keys using .keys() method
pet = {'color': 'red', 'age': 42}
for key in pet.keys():  # Loop through all keys
    print(key)
color
age

Нет необходимости использовать .keys(), так как по умолчанию вы будете перебирать ключи:

# Iterating over dictionary directly loops through keys (default behavior)
pet = {'color': 'red', 'age': 42}
for key in pet:  # Equivalent to for key in pet.keys()
    print(key)
color
age

items()

Метод items() получает элементы словаря и возвращает их в виде кортежа (Tuple):

pet = {'color': 'red', 'age': 42}
for item in pet.items():
    print(item)
('color', 'red')
('age', 42)

Используя методы keys(), values() и items(), цикл for может перебирать ключи, значения или пары ключ-значение в словаре соответственно.

# Iterate over key-value pairs using .items() method
pet = {'color': 'red', 'age': 42}
for key, value in pet.items():  # Unpack tuple into key and value
    print(f'Key: {key} Value: {value}')
Key: color Value: red
Key: age Value: 42

get()

Метод get() возвращает значение элемента с заданным ключом. Если ключ не существует, он возвращает None:

# .get() method: safely retrieve value, returns None if key doesn't exist
wife = {'name': 'Rose', 'age': 33}

f'My wife name is {wife.get("name")}'  # Returns 'Rose'
'My wife name is Rose'
f'She is {wife.get("age")} years old.'
'She is 33 years old.'
f'She is deeply in love with {wife.get("husband")}'
'She is deeply in love with None'

Вы также можете изменить значение по умолчанию None на то, которое выберете:

wife = {'name': 'Rose', 'age': 33}

f'She is deeply in love with {wife.get("husband", "lover")}'
'She is deeply in love with lover'

Добавление элементов с помощью setdefault()

Можно добавить элемент в словарь таким образом:

wife = {'name': 'Rose', 'age': 33}
if 'has_hair' not in wife:
    wife['has_hair'] = True

Используя метод setdefault, мы можем сделать тот же код короче:

wife = {'name': 'Rose', 'age': 33}
wife.setdefault('has_hair', True)
wife
{'name': 'Rose', 'age': 33, 'has_hair': True}

Удаление элементов

pop()

Метод pop() удаляет и возвращает элемент по заданному ключу.

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.pop('age')
33
wife
{'name': 'Rose', 'hair': 'brown'}
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Что делает pop() при вызове на словаре?
A. Только удаляет пару ключ-значение
B. Удаляет и возвращает значение для указанного ключа
C. Только возвращает значение, не удаляя его
D. Удаляет все элементы из словаря

popitem()

Метод popitem() удаляет последний элемент в словаре и возвращает его.

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.popitem()
('hair', 'brown')
wife
{'name': 'Rose', 'age': 33}

del

Метод del удаляет элемент по заданному ключу.

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
del wife['age']
wife
{'name': 'Rose', 'hair': 'brown'}

clear()

Метод clear() удаляет все элементы в словаре.

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.clear()
wife
{}

Проверка ключей в словаре

person = {'name': 'Rose', 'age': 33}

'name' in person.keys()
True
'height' in person.keys()
False
'skin' in person # You can omit keys()
False

Проверка значений в словаре

person = {'name': 'Rose', 'age': 33}

'Rose' in person.values()
True
33 in person.values()
True

Красивый вывод (Pretty Printing)

import pprint

wife = {'name': 'Rose', 'age': 33, 'has_hair': True, 'hair_color': 'brown', 'height': 1.6, 'eye_color': 'brown'}
pprint.pprint(wife)
{'age': 33,
 'eye_color': 'brown',
 'hair_color': 'brown',
 'has_hair': True,
 'height': 1.6,
 'name': 'Rose'}

Объединение двух словарей

Для Python 3.5+:

dict_a = {'a': 1, 'b': 2}
dict_b = {'b': 3, 'c': 4}
dict_c = {**dict_b, **dict_a}
dict_c
{'a': 1, 'b': 3, 'c': 4}
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

При объединении двух словарей с помощью {**dict_b, **dict_a}, что произойдет, если у обоих словарей есть один и тот же ключ?
A. Значение из dict_b перезаписывает значение из dict_a
B. Значение из dict_a перезаписывает значение из dict_b
C. Оба значения сохраняются в списке
D. Вызывается ошибка

Связанные ссылки