Словарные значения и работа с представлением dict.values()

Раздел: Структуры данных -> dict

Представление значений словаря в методе values()

Метод values() формирует объект dict_values, который связан с исходным словарём. Этот объект не создаёт самостоятельный список, а отображает текущее состояние значений.

d = {'a': 1, 'b': 2}
values_view = d.values()
print(values_view)
print(list(values_view))

Python list to dict (преобразование списка в словарь)

dict_values([1, 2])
[1, 2]

Python sort dict (сортировка словаря в python)

Для объекта dict_values доступны операции len(), in и итерация. Индексация, срезы и изменение элементов не поддерживаются.

Как получить список значений словаря на текущий момент?

Функция list() принимает представление dict_values и превращает его в обычный список.

d = {'x': 10, 'y': 20}
snapshot = list(d.values())
d['z'] = 30
print(snapshot)
print(d)

добавление в словарь python (добавление в словарь python)

[10, 20]
{'x': 10, 'y': 20, 'z': 30}

Python dict add (добавление элемента в словарь python)

Полученный список сохраняет прежние значения, даже если исходный словарь потом изменяется.

Как собрать значения без вызова values()?

Альтернативный способ состоит в переборе ключей и обращении к словарю по ключу.

d = {'red': 100, 'green': 200}
values_by_key = [d[key] for key in d]
print(values_by_key)

Python значение ключа словаря (значение ключа словаря в python)

[100, 200]

Python получить ключ (получение ключа словаря в python)

Такой вариант позволяет добавить условие к ключу, например отобрать только те значения, где ключ содержит подстроку 'red'.

Как выполняется перебор всех значений словаря?

Цикл for последовательно получает каждое значение словаря.

d = {'n': 3, 'k': 4}
for value in d.values():
    print(value * value)

Python элемент словаря по ключу (получение элемента словаря по ключу)

9
16

Key list python (список ключей словаря python)

Изменение значений по существующим ключам во время такого цикла допустимо.

Как проверить присутствие значения среди элементов словаря?

Оператор in выполняет проверку с учётом равенства объектов.

d = {'one': 1, 'two': 4}
print(4 in d.values())
print(9 in d.values())

Python dict добавить (добавление элемента в словарь python)

True
False

как добавить значение в словарь python (добавление значения в словарь python)

Частая ошибка связана с тем, что dict_values принимают за список. Индексное обращение вызывает исключение TypeError.

d = {'a': 1}
d.values()[0]

элементы словаря python (элементы словаря в python)

TypeError: 'dict_values' object is not subscriptable

Python dict values (метод values() словаря в python)

Для получения первого значения следует применить list(d.values())[0].

Если во время итерации по dict_values добавить или удалить ключ, возникает RuntimeError.

d = {'one': 1, 'two': 2}
for value in d.values():
    d['three'] = 3

Python вывести словарь (вывести словарь в python)

RuntimeError: dictionary changed size during iteration

Изменение размера представления запрещено, поэтому новые ключи добавляют после завершения цикла или на основе заранее созданной копии словаря.

Динамичность представления dict_values

View-объект сохраняет связь со словарём в течение всей своей жизни.

Пример
d = {'a': 5}
view = d.values()
print(view)
d['b'] = 6
print(view)
del d['a']
print(view)
dict_values([5])
dict_values([5, 6])
dict_values([6])

Значение 5 исчезло из представления после удаления ключа 'a'.

Вычисления без создания промежуточного списка

Метод values() часто применяется вместе со встроенными функциями.

Пример
scores = {'math': 85, 'physics': 90, 'chemistry': 78}
total = sum(scores.values())
average = total / len(scores.values())
min_score = min(scores.values())
max_score = max(scores.values())
print(total)
print(average)
print(min_score)
print(max_score)
253
84.33333333333333
78
90

Передача view напрямую в сумму и минимум экономит память, поскольку копия списка не создаётся.

Определение числа уникальных значений

Пример
statuses = {'a': 'ready', 'b': 'running', 'c': 'ready'}
unique_statuses = set(statuses.values())
print(len(unique_statuses))
print(unique_statuses)
2
{'running', 'ready'}

Значения строкового типа являются хешируемыми, поэтому функция set() отбирает уникальные элементы.

Если значением оказывается список, попытка построить из него множество вызывает ошибку.

Пример
data = {'x': [1, 2], 'y': [1, 2]}
set(data.values())
TypeError: unhashable type: 'list'

Работа с такими данными требует обхода значений циклом и применения пользовательской проверки уникальности.

Циклическая обработка вложенных структур

Значения словаря часто являются словарями или другими контейнерами. Метод values() даёт доступ к этим контейнерам.

Пример
persons = {
    'ivan': {'city': 'Kazan', 'age': 30},
    'olga': {'city': 'Moscow', 'age': 25}
}
for profile in persons.values():
    print(profile['city'], profile['age'])
Kazan 30
Moscow 25

Использование any и all для анализа значений

Функции any() и all() принимают любое итерируемое представление, включая dict_values.

Пример
settings = {'volume': 0, 'brightness': 0, 'sound': 0}
print(any(settings.values()))
print(all(settings.values()))
settings['volume'] = 5
print(any(settings.values()))
print(all(settings.values()))
False
False
True
False

Если хотя бы одно значение становится ненулевым, any() возвращает True.

Порядок значений и порядок ключей

Словари Python 3.7 и новее сохраняют порядок вставки. Поэтому values() и keys() при совместном переборе не расходятся.

Пример
d = {'a': 1, 'b': 2}
for key, value in zip(d.keys(), d.values()):
    print(f'{key} -> {value}')
a -> 1
b -> 2

Для объединения ключей и значений удобнее применять items(), но совпадение порядка двух представлений остаётся полезным при работе с отдельными коллекциями ключей и значений.

Метод values() словаря в Python - comments

En
Python dict values (python)