python3中zip()后元素只能访问一次?(附zip函数详解)

目录

一.python3中zip()后元素只能访问一次

一.1 为什么只能访问一次

一.2 那如果想要多次访问呢?

二、zip函数详解

一.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)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值