在进行列表遍历的时候,希望同时遍历多个列表。
在使用循环遍历两个列表时,希望x,y各自获取到数组a,b里全部的元素,却产生了意料之外的报错
ValueError: too many values to unpack (expected 2)
让我们来看看代码
a = [1,2,3]
b = [5,6,7]
for x,y in a,b:
print("x:",x,"y:",y)
'''
ValueError: too many values to unpack (expected 2)
'''
观察报错,说给予的值太多了,期望的是两个。而我们哪里有超过两个的值呢?肯定不可能是x,y这边出的问题,那就只有可能是a,b里的值太多了。尝试去调试一下
a = [1,2]
b = [5,6]
for x,y in a,b:
print("x:",x,"y:",y)
不出所料跑通了,但是问题又出现了,他的遍历方式好像与我们期望的不同,他好像是一个纵向的遍历。
x: 1 y: 2
x: 5 y: 6
Process finished with exit code 0
如果确实是纵向的遍历那问题就能说得通了,如果列表的列数多于变量数了,那多的那几列就没有变量去遍历了,那也满足了所谓的too many values to unpack,可这毕竟只是猜想,让我们证实一下。
#第一步:通过增加遍历的变量来证明
a = [1,2]
b = [5,6]
for x,y,z in a,b:
print("x:",x,"y:",y)
#报错:
#ValueError: not enough values to unpack (expected 3, got 2)
#符合猜想
#第二步:扩充被遍历的列表
a = [1,2,3]
b = [5,6,7]
c = [8,9,10]
for x,y,z in a,b,c:
print("x:",x,"y:",y,"z:",z)
'''
输出:
x: 1 y: 2 z: 3
x: 5 y: 6 z: 7
x: 8 y: 9 z: 10
Process finished with exit code 0
符合猜想
'''
虽然我们通过实验搞清了原理,但只是解决了报错,真正的想实现我们预想的迭代方式该怎么做呢?
其实python里面的字典键值对的形式就能很好的解决这个问题。
a = [1,2,3,4]
b = [5,6,7,8]
t = dict(zip(a,b))
for x,y in t.items():
print("x:",x,"y:",y)
'''
x: 1 y: 5
x: 2 y: 6
x: 3 y: 7
x: 4 y: 8
Process finished with exit code 0
'''