目录
一.python3中zip()后元素只能访问一次
zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象————返回一个zip对象,其内部元素为元组;可以转化为列表或元组;
一.1 为什么只能访问一次
zip()函数在python3中,出于优化内存的考虑,只能访问一次,操作一次后,内存就会释放!!!(python2中可以访问多次).
例子:
将 x ,y 两个列表用 zip 转化为 对应的元素打包成一个tuple。在用相同的 for 循环去遍历两次。
x = [1, 2, 3]
y = [4, 5, 6]
xy = zip(x, y)
print(xy)
for item in xy:
print('第一次',item)
print('-----------------------------------------')
print(xy)
for i in xy:
print('第二次',i)
print('-----------------------------------------')
输出结果如下:
第一次的 for 能够将元素正常取出来。但是第二次没有元素。
在python 3.0中有个大坑,即zip中的数据只能操作一次,内存就会释放,当下次访问时就会无法访问.
一.2 那如果想要多次访问呢?
把他转换为其他类型,需要注意的是,在转换前不要访问。
如,转换为字典,需要注意的是,在转换前不要访问,一旦访问就被释放,那转换之后就是空字典了
x = [1, 2, 3]
y = [4, 5, 6]
xy = zip(x, y)
# 在用dict转换成字典之前,中间不要有其他代码访问,否则访问过后就被释放,转换之后就是空字典
d = dict(xy)
print(d)
for item in d:
print('第一次',item)
print('-----------------------------------------')
print(d)
for i in d:
print('第二次',i)
print('-----------------------------------------')
x = [1, 2, 3]
y = [4, 5, 6]
'''xy = zip(x, y)
# 在用dict转换成字典之前,中间不要有其他代码访问,否则访问过后就被释放,转换之后就是空字典
d = dict(xy)'''
#为了避免中途被访问,可以直接一步完成
d = dict(zip(x, y))
print(d)
for item in d:
print('第一次',item)
print('-----------------------------------------')
print(d)
for i in d:
print('第二次',i)
print('-----------------------------------------')
二、zip函数详解
原文参考: Python的zip函数 - frydsh - 博客园
zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。
1.示例1:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
print(xyz)
for i in xyz :
print(i)
运行的结果是:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
从这个结果可以看出zip函数的基本运作方式——当zip()函数有多个参数时,zip()函数分别从中依次各取出一个元素组成元组,再将依次组成的元组组合成一个新的迭代器–新的zip类型数据。以3个为例:zip(a,b,c) --> ((a0,b0,c0),(a1,b1,c1),(a2,b2,c2)....)
2.示例2:
x = [1, 2, 3]
y = [4, 5, 6, 7]
xy = zip(x, y)
print(xy)
for i in xy :
print(i)
运行的结果是:
[(1, 4), (2, 5), (3, 6)]
从这个结果可以看出zip函数的长度处理方式——zip(a,b),若a与b的维数相同,当两者具有相同的行数与列数时,正常组合对应位置元素即可;
当a与b的行数或列数不同时,取两者结构中最小的行数和列数,依照最小的行数和列数将
对应位置的元素进行组合;
3.示例3:
x = [1, 2, 3]
x = zip(x)
print(x)
for i in x:
print(i)
运行的结果是:
[(1,), (2,), (3,)]
从这个结果可以看出zip函数在只有一个参数时运作的方式。
4.示例4:
x = zip()
print(x)
for i in x:
print(i)
运行的结果是:
[]
从这个结果可以看出zip函数在没有参数时运作的方式。
5.示例5:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
u = zip(*xyz)
print(u)
for i in xyz:
print(i)
运行的结果是:
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
zip(*args)函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。一般认为这是一个unzip的过程,它的运行机制是这样的:
在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))
所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
注:在函数调用中使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数(前提是对应函数支持不定个数的位置参数)
6.示例6:
x = [1, 2, 3]
r = zip(* [x] * 3)
print(r)
for i in r:
print(i)
运行的结果是:
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
它的运行机制是这样的:
[x]生成一个列表的列表,它只有一个元素x
[x] * 3生成一个列表的列表,它有3个元素,[x, x, x]
zip(* [x] * 3)的意思就明确了,zip(x, x, x)