a=[1,2,3]
b=[4,5,6]
zipped=zip(a,b)
print(zipped)
# for i in zipped:
# print(i)
aa,bb=zip(*zipped)
print(aa,bb)
'''
输出:
<zip object at 0x00000290BF16F288>
(1, 2, 3) (4, 5, 6)
'''
a=[1,2,3]
b=[4,5,6]
zipped=zip(a,b)
print(zipped)
for i in zipped:
print(i)
aa,bb=zip(*zipped)
print(aa,bb)
'''
输出:
Traceback (most recent call last):
File "D:/PycharmProjects/first/worker/c.py", line 7, in <module>
aa,bb=zip(*zipped)
ValueError: not enough values to unpack (expected 2, got 0)
<zip object at 0x00000187754DF288>
(1, 4)
(2, 5)
(3, 6)
'''
如果在for循环后再zip压缩一次aa,bb=zip(*zip(a,b))就不会报错。
for循环是解压了么,可是在for循环前后输出类型type(zipped)都显示class zip。输出id(zipped)都显示相同的id号。输出zipped都显示相同的zip object
for循环究竟做了什么?
因为zip()返回的是迭代对象, 迭代对象只能遍历一次
迭代对象遍历了一次之后内部的迭代指针指向最后一个元素之后,
第二次遍历时从上次迭代指针指向的位置(最后一个元素之后)开始遍历,自然就没有了.
用list()转成列表就可以多次遍历了
改成zipped= list( zip(a,b) )
a=[1,2,3]
b=[4,5,6]
zipped= list( zip(a,b) )
print(zipped)
for i in zipped:
print(i)
aa,bb=zip(*zipped)
print(aa,bb)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]