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: too many values to unpack (expected 2) a, b = ['apple', 'banana', 'kiwi']
声明与 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'
我还写了一篇关于
如何通过索引访问列表中的多个元素的文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: