В этой статье мы рассмотрим из-за чего возникает ошибка ValueError: too many values to unpack и как ее исправить в Python.
Введение
Если вы получаете ValueError: too many values to unpack (expected 2), это означает, что вы пытаетесь получить доступ к слишком большому количеству значений из итератора.
Ошибка Value Error — это стандартное исключение, которое может возникнуть, если метод получает аргумент с правильным типом данных, но недопустимым значением, или если значение, предоставленное методу, выходит за пределы допустимого диапазона.
В этой статье мы рассмотрим, что означает эта ошибка, в каких случаях она возникает и как ее устранить на примерах.
Что такое распаковка в Python?
В Python функция может возвращать несколько значений, и они могут быть сохранены в переменной. Это одна из уникальных особенностей Python по сравнению с другими языками, такими как C++, Java, C# и др.
Распаковка в Python — это операция, при которой значения итерабильного объекта будут присвоена кортежу или списку переменных.
Распаковка списка в Python
В этом примере мы распаковываем список элементов, где каждый элемент, который мы возвращаем из списка, должен присваиваться переменной в левой части для хранения этих элементов.
one, two, three = [1, 2, 3] print(one) print(two) print(three)
Вывод программы
1 2 3
Распаковка списка с использованием подчеркивания
Подчеркивание чаще всего используется для игнорирования значений; когда _ используется в качестве переменной, когда мы не хотим использовать эту переменную в дальнейшем.
one, two, _ = [1, 2, 3] print(one) print(two) print(_)
Вывод программы
1 2 3
Распаковка списка с помощью звездочки
Недостаток подчеркивания в том, что оно может хранить только одно итерируемое значение, но что если у вас слишком много значений, которые приходят динамически?
Здесь на помощь приходит звездочка. Мы можем использовать переменную со звездочкой впереди для распаковки всех значений, которые не назначены, и она может хранить все эти элементы.
one, two, *z = [1, 2, 3, 4, 5, 6, 7, 8] print(one) print(two) print(z)
Вывод программы
1 2 [3, 4, 5, 6, 7, 8]
После того, как мы разобрались с распаковкой можно перейти к нашей ошибке.
Что значит ValueError: too many values to unpack?
ValueError: too many values to unpack возникает при несоответствии между возвращаемыми значениями и количеством переменных, объявленных для хранения этих значений. Если у вас больше объектов для присвоения и меньше переменных для хранения, вы получаете ошибку значения.
Ошибка возникает в основном в двух сценариях
Сценарий 1: Распаковка элементов списка
Давайте рассмотрим простой пример, который возвращает итерабильный объект из четырех элементов вместо трех, и у нас есть три переменные для хранения этих элементов в левой части.
В приведенном ниже примере у нас есть 3 переменные one, two, three но мы возвращаем 4 итерабельных элемента из списка.
one, two, three = [1, 2, 3, 4]
Вывод программы
Traceback (most recent call last): File "/Users/krnlnx/Projects/Test/test.py", line 1, in <module> one, two, three = [1, 2, 3, 4] ValueError: too many values to unpack (expected 3)
Решение
При распаковке списка в переменные количество переменных, которые вы хотите распаковать, должно быть равно количеству элементов в списке.
Если вы уже знаете количество элементов в списке, то убедитесь, что у вас есть равное количество переменных в левой части для хранения этих элементов для решения.
Если вы не знаете количество элементов в списке или если ваш список динамический, то вы можете распаковать список с помощью оператора звездочки. Это обеспечит хранение всех нераспакованных элементов в одной переменной с оператором звездочка.
Сценарий 2: Распаковка словаря
В Python словарь — это набор неупорядоченных элементов, содержащих пары ключ-значение. Рассмотрим простой пример, который состоит из трех ключей, и каждый из них содержит значение, как показано ниже.
Если нам нужно извлечь и вывести каждую из пар ключ-значение в словаре, мы можем использовать итерацию элементов словаря с помощью цикла for.
Давайте запустим наш код и посмотрим, что произойдет
city = {"name": "Saint Petersburg", "population": 5000000, "country": "Russia"} for k, v in city: print(k, v)
Вывод программы
Traceback (most recent call last): File "/Users/krnlnx/Projects/Test/test.py", line 3, in <module> for k, v in city: ValueError: too many values to unpack (expected 2)
В приведенном выше коде мы получаем ошибку, потому что каждый элемент в словаре «city» является значением.
В Python мы не должны рассматривать ключи и значения в словаре как две отдельные сущности.
Решение
Мы можем устранить ошибку с помощью метода items(). Функция items() возвращает объект представления, который содержит обе пары ключ-значение, сохраненные в виде кортежей.
Подробнее про итерацию словаря читайте по ссылке.
city = {"name": "Saint Petersburg", "population": 5000000, "country": "Russia"} for k, v in city.items(): print(k, v)
Вывод программы
name Saint Petersburg population 5000000 country Russia
Примечание: Если вы используете Python 2.x, вам нужно использовать функцию iteritems() вместо функции items().
Заключение
В этой статье мы рассмотрели, почему в Python возникает ошибка «ValueError: too many values to unpack », разобрались в причинах и механизме ее возникновения. Мы также увидели, что этой ошибки можно избежать.
Спасибо! Очень помогло
пожалуйста))
Круто, спасибо!!!
Очень познавательно!!!
согласен с вами)