ValueError:在 Python 中要解压的值太多(预期为 2)

ValueError: 在 Python 中要解压的值太多(预期为 2)

ValueError: too many values to unpack (expected 2) in Python

Python“ValueError: too many values to unpack (expected 2) in Python”发生在赋值中的变量数量与迭代中的值数量不同时。

要解决该错误,请声明与 iterable 中的项目一样多的变量。

valueerror 太多值无法解压预期 2

下面是错误如何发生的示例。

主程序
# ⛔️ ValueError: too many values to unpack (expected 2) a, b = ['apple', 'banana', 'kiwi']
我们声明了 2 个变量,但列表包含 3 个项目。列表中的变量数和项目数不一致导致错误。

声明与 iterable 中的项目一样多的变量

要解决该错误,请确保声明的变量与可迭代对象中的项目一样多。

主程序
a, b, k = ['apple', 'banana', 'kiwi'] print(a) # 👉️ 'apple' print(b) # 👉️ 'banana' print(k) # 👉️ 'kiwi'

我们声明了 3 个变量,列表包含 3 个值,所以一切都按预期进行。

同样,如果列表有 2 个项目,则声明 2 个变量。

主程序
a, b = ['apple', 'banana'] print(a) # 👉️ 'apple' print(b) # 👉️ 'banana'

如果您不需要使用一个或多个值,请使用下划线作为占位符。

主程序
a, b, _ = ['one', 'two', 'three'] print(a) # 👉️ one print(b) # 👉️ two

下划线没有特殊含义。它用作一次性变量,并向代码的读者发出不需要该值的信号。

解包时可以根据需要使用尽可能多的下划线。

主程序
a, _, c, _ = ['one', 'two', 'three', 'four'] print(a) # 👉️ one print(c) # 👉️ three

使用items()方法遍历字典

当尝试在不使用该方法的情况下遍历字典时,通常会导致错误items()

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 29} # ⛔️ ValueError: too many values to unpack (expected 2) for key, value in my_dict: print(key, value)

当我们使用for循环遍历字典时,我们只能访问键。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 29} for key in my_dict: # name Bobby Hadz # age 29 print(key, my_dict[key])

我们可以使用该dict.items()方法遍历具有键和值访问权限的字典。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 29} for key, value in my_dict.items(): print(key, value) # 👉️ name Alice, age 29

dict.items
方法返回字典项((键,值)对)的新视图

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 29} # 👇️ dict_items([('name', 'Bobby Hadz'), ('age', 29)]) print(my_dict.items())

每个元组中的第一个元素是键,第二个是值。

迭代列表或元组访问索引

在尝试使用索引遍历列表或元组时,您也可能会遇到错误。

主程序
my_list = ['apple', 'banana', 'melon'] # ⛔️ ValueError: too many values to unpack (expected 2) for index, item in my_list: print(index, item)

当使用循环遍历列表时for,我们只能访问当前迭代的项目。

您可以使用该enumerate函数迭代带有索引的列表或元组。

主程序
my_list = ['apple', 'banana', 'melon'] for index, item in enumerate(my_list): print(index, item) # 👉️ 0 apple, 1 banana, 2 melon

enumerate函数接受一个可迭代对象并返回一个包含元组的枚举对象,其中第一个元素是索引,第二个元素是项目。

解包函数返回值的项目

当我们尝试
解压缩
函数返回值的项目
时,也会发生该错误。

主程序
def get_tuple(): return ('apple', 'banana', 'kiwi') # ⛔️ ValueError: too many values to unpack (expected 2) a, b = get_tuple()

元组包含 3 个元素,但我们只声明了 2 个变量。

确保声明的变量与函数返回的可迭代对象中的项目一样多。

主程序
def get_tuple(): return ('apple', 'banana', 'kiwi') a, b, k = get_tuple() print(a) # 👉️ 'apple' print(b) # 👉️ 'banana' print(k) # 👉️ 'kiwi'

该函数返回一个包含 3 个元素的元组,因此我们必须准确声明 3 个变量。

从字符串中解包值

当我们尝试从字符串中解包值时也会导致错误。

主程序
my_str = 'apple,banana' # ⛔️ ValueError: too many values to unpack (expected 2) a, b = my_str

从字符串中解包时,每个变量声明都计为一个字符。

主程序
a, b, c = 'xyz' print(a) # 👉️ x print(b) # 👉️ y print(c) # 👉️ z

为了解决这个错误,我们必须在解包值之前用逗号拆分字符串。

主程序
my_list = 'apple,banana'.split(',') print(my_list) # 👉️ ['apple', 'banana'] a, b = my_list print(a) # 👉️ 'apple' print(b) # 👉️ 'banana'

str.split ()方法使用定界符将字符串拆分为子字符串列表。

该方法采用以下 2 个参数:

姓名 描述
分隔器 在每次出现分隔符时将字符串拆分为子字符串
最大分裂 最多maxsplit完成拆分(可选)
当没有分隔符传递给该str.split()方法时,它会将输入字符串拆分为一个或多个空白字符。
主程序
print('bobby,hadz'.split(',')) # 👉️ ['bobby', 'hadz'] print('bobby_hadz'.split('_')) # 👉️ ['bobby', 'hadz'] print('bobby hadz'.split(' ')) # 👉️ ['bobby', 'hadz']

如果您打算将特定字符解包到变量中,请确保声明的变量与字符串中的字符数完全一样。

主程序
my_str = 'hi' h, i = my_str print(h) # 👉️ 'h' print(i) # 👉️ 'i'

我还写了一篇关于
如何通过索引访问列表中的多个元素的文章。

想了解更多有关访问 Python 序列中的值的信息吗? 查看这些资源: 从 Python 中的字典中获取多个值在 Python 中的 For 循环中使用多个变量

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: