Values: примеры (PYTHON)

Функция values() для получения значений из словаря Python
Раздел: Словари, Итерации
values: dict_values

Функция values() для словарей в Python

Метод values() принадлежит встроенному типу данных dict (словарь). Его задача - возвращать представление всех значений, содержащихся в словаре.

Основное применение - получение доступа к значениям словаря без необходимости работать с соответствующими ключами. Это полезно для операций, где важны только значения: подсчет суммы, поиск максимального или минимального значения, проверка наличия конкретного значения.

Синтаксис метода прост: dict.values(). Он не принимает никаких аргументов.

Возвращаемым значением является объект представления (view object) типа dict_values. Это динамическое представление, которое автоматически отражает все изменения в исходном словаре (добавление, удаление, изменение значений). Объект dict_values является итерируемым (его можно использовать в цикле for), поддерживает проверку на членство (оператор in) и имеет неопределенную длину. Для получения статического списка значений его можно преобразовать в список с помощью list().

Простые примеры использования values()

Базовый пример получения значений:

person = {"name": "Анна", "age": 30, "city": "Москва"}
values_view = person.values()
print(values_view)
print(type(values_view))
dict_values(['Анна', 30, 'Москва'])
<class 'dict_values'>

Итерация по значениям:

for value in person.values():
    print(value)
Анна
30
Москва

Проверка наличия значения:

print(30 in person.values())
print("Санкт-Петербург" in person.values())
True
False

Преобразование в список для дальнейшей обработки:

values_list = list(person.values())
print(values_list)
print("Сумма возрастов в словаре:", sum([val for val in person.values() if isinstance(val, int)]))
['Анна', 30, 'Москва']
Сумма возрастов в словаре: 30

Похожие методы словаря в Python

У словарей есть два других схожих метода представления:

  • keys(): Возвращает представление (dict_keys) всех ключей словаря. Используется, когда нужен доступ только к ключам, например для проверки существования ключа или итерации по ним.
  • items(): Возвращает представление (dict_items) пар «ключ-значение» в виде кортежей. Это самый частый способ итерации по словарю, так как предоставляет одновременный доступ и к ключу, и к значению.

Выбор метода зависит от задачи. Для работы только со значениями подходит values(). Для одновременной работы с ключами и значениями эффективнее items(). Метод keys() чаще всего применяется для проверки принадлежности ключа словарю.

Частые ошибки и особенности

1. Попытка использования на не-словаре: Метод values() существует только у объектов типа dict.

my_list = [1, 2, 3]
try:
    my_list.values()
except AttributeError as e:
    print(f"Ошибка: {e}")
Ошибка: 'list' object has no attribute 'values'

2. Изменение размера словаря во время итерации: Прямое удаление или добавление элементов в словарь во время итерации по dict_values может привести к ошибке RuntimeError. Решение - итерироваться по копии списка ключей или значений.

data = {"a": 1, "b": 2, "c": 3}
try:
    for v in data.values():
        if v == 2:
            del data["b"]  # Меняем размер словаря во время итерации
except RuntimeError as e:
    print(f"Ошибка: {e}")
Ошибка: dictionary changed size during iteration

3. Отсутствие индексации: Объект dict_values не поддерживает индексацию.

vals = {"x": 10, "y": 20}.values()
try:
    print(vals[0])
except TypeError as e:
    print(f"Ошибка: {e}")
Ошибка: 'dict_values' object is not subscriptable

История изменений

В Python 3 ключевое изменение произошло с выходом версии 3.0. В Python 2 метод values() возвращал список (list). Начиная с Python 3, для повышения эффективности использования памяти и скорости работы был введен объект представления (dict_values), который предоставляет динамический вид на значения словаря. Это изменение затронуло и методы keys() с items().

Объекты представления стали итерируемыми, они отражают изменения в словаре и потребляют меньше памяти, так как не создают копию данных. Для получения классического списка теперь требуется явное преобразование функцией list().

Расширенные и специальные примеры

Использование в генераторах и для создания коллекций:

Пример python
inventory = {"яблоки": 50, "бананы": 25, "апельсины": 30}
# Подсчет общего количества товаров
total_items = sum(inventory.values())
print(f"Всего товаров на складе: {total_items}")
Всего товаров на складе: 105

Поиск уникальных значений в нескольких словарях:

Пример python
dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = {"d": 2, "e": 3, "f": 4}
unique_vals = set(dict1.values()) | set(dict2.values())
print("Уникальные значения:", unique_vals)
Уникальные значения: {1, 2, 3, 4}

Сортировка словаря по значениям с помощью values():

Пример python
scores = {"Alice": 95, "Bob": 87, "Charlie": 92}
# Сортировка по убыванию значения
sorted_by_value = dict(sorted(scores.items(), key=lambda item: item[1], reverse=True))
print("Отсортировано по оценкам:", sorted_by_value)
Отсортировано по оценкам: {'Alice': 95, 'Charlie': 92, 'Bob': 87}

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

Пример python
original = {"id": 1}
view = original.values()
print("До изменения:", list(view))
original["id"] = 999
original["new_key"] = "value"
print("После изменения словаря:", list(view))
До изменения: [1]
После изменения словаря: [999, 'value']

Применение в условиях проверки:

Пример python
config = {"debug": False, "log_level": "INFO", "retry": 3}
if any(isinstance(v, bool) for v in config.values()):
    print("В конфигурации есть булевый параметр")
В конфигурации есть булевый параметр

Аналоги в других языках программирования

Концепция получения коллекции значений ассоциативного массива присутствует во многих языках.

JavaScript: Метод Object.values() возвращает массив значений. В отличие от динамического представления в Python, это статический массив.

const person = {name: "Анна", age: 30, city: "Москва"};
console.log(Object.values(person)); // ['Анна', 30, 'Москва']

PHP: Функция array_values() возвращает индексированный массив всех значений, сбрасывая ключи.

$person = ["name" => "Анна", "age" => 30, "city" => "Москва"];
print_r(array_values($person)); // Array ( [0] => Анна [1] => 30 [2] => Москва )

Java (Map): Метод values() интерфейса Map<K, V> возвращает коллекцию (Collection<V>), которая также является представлением исходной карты.

Map<String, Object> person = Map.of("name", "Анна", "age", 30, "city", "Москва");
System.out.println(person.values()); // [Москва, Анна, 30]

C# (Dictionary): Свойство Values возвращает коллекцию Dictionary<TKey, TValue>.ValueCollection, которая является динамическим представлением.

var person = new Dictionary<string, object>() {{ "name", "Анна" }, { "age", 30 }, { "city", "Москва" }};
foreach (var value in person.Values) Console.WriteLine(value);

Golang (map): Прямого аналога нет. Значения можно получить только в цикле, итерируясь по карте, или собрать в срез вручную.

person := map[string]interface{}{"name": "Анна", "age": 30, "city": "Москва"}
for _, value := range person {
    fmt.Println(value)
}

питон values function comments

En
Values Return view of dict values