Python值解包报错:如何在循环中关联列表字典与字典值
问题分析与解决
你的代码场景
现有字典:
a = { 'a': 'abc', 'b': 'xyz', 'c': 'yyy' }
字典列表:
list_dict = [ {'id': 5903032523805, 'value': 'aaa'}, {'id': 5903031568925, 'value': 'bbb'}, {'id': 5902976332061, 'value': 'ccc'} ]
你尝试执行的代码:
for i, j in list_dict, a.values(): print(i['id'], j)
报错:Error: too many values to unpack (expected 2)
错误原因
你写的list_dict, a.values()会生成一个二元组,里面装的是两个完整的可迭代对象:第一个是整个list_dict列表,第二个是dict_values对象。
循环执行时,第一次迭代会取这个二元组的第一个元素(也就是整个list_dict),然后试图把它解包成i,j两个变量,但list_dict包含3个元素,远超过预期的2个,因此触发解包错误。
你的真实需求应该是并行遍历两个可迭代对象的对应元素,这时候需要用zip()函数来实现元素配对。
正确写法
for i, j in zip(list_dict, a.values()): print(i['id'], j)
说明
zip(list_dict, a.values())会把两个可迭代对象中位置对应的元素打包成元组,比如:
- 第一个元组:
(list_dict[0], 'abc') - 第二个元组:
(list_dict[1], 'xyz') - 第三个元组:
(list_dict[2], 'yyy')
循环时,每个元组会被正确解包给i和j,i拿到list_dict里的单个字典,j拿到a中对应位置的值,这样就能正常输出id和对应值了。
注意:如果两个可迭代对象长度不一致,zip()会以较短的那个为准提前终止迭代;如果需要保留所有元素(缺失位置用默认值填充),可以使用itertools.zip_longest。
内容的提问来源于stack exchange,提问作者Mahesh Manjunath
相关产品推荐
相关产品推荐

