Словарные значения и работа с представлением dict.values()
Представление значений словаря в методе 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'] = 3Python вывести словарь (вывести словарь в 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(), но совпадение порядка двух представлений остаётся полезным при работе с отдельными коллекциями ключей и значений.