python zip函数用于for循环,python中zip函数的作用

本文详细介绍了Python内置函数zip的作用,包括其工作原理、使用方法、列表和元组的处理,以及在for循环中的应用。重点讲解了如何进行打包和解包,以及集合作为参数时的特殊行为。
摘要由CSDN通过智能技术生成

大家好,小编来为大家解答以下问题,python zip函数用于for循环,python中zip函数的作用,现在让我们一起来看看吧!

1 内置函数:

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)
  • zip(iterables) 创建一个迭代器,它从每个迭代器中聚合元素。 返回一个元组的迭代器,其中i-th元组包含每个参数序列或迭代器的i-th元素python的皮卡丘如何写代码。当最短的输入迭代被耗尽时,迭代器就停止了。使用一个迭代的参数,它返回一个1元组的迭代器。没有参数,它返回一个空的迭代器。 

2 使用方法:

比如使用zz = zip(a,b,c,d)赋值

  • zip返回值是元组,但无法直接打印,输出方法:
    • list()方法:输出r的是列表
    • 赋值的形式输出x,y….. = zip() 变量个数要与元组的个数对应,而不是对应每个元组中的元素个数
    • 用for遍历 for i , j , k , …. in zip()
  • print(zz): 输出的是地址
  • print(list(zz)): 将zz变为列表,进行输出,即 [(),()……]
  • 当第一次使用zz后,则已经解包了,再使用zz,则为空
    • 第1次:print(list(zz),输出 [(1,1,1),(2,2,2),......]
    • 第2次:print(list(zz),输出 [ ]
  • zip()使用list()方法输出:
x = [1, 2, 3]
y = [4, 5, 6]
zz = zip(x, y)
print(list(zz))
[(1, 4), (2, 5), (3, 6)]
  •  使用赋值的形式x,y….. = zip()输出
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
d=[10,11,12]
zz=zip(a,b,c,d)

x,y,z = zz 
print(x)
print(y)
print(z)

输出:
(1, 4, 7, 10)
(2, 5, 8, 11)
(3, 6, 9, 12)
  • for 循环遍历,

    • 对列表[ ]元素的个数进行遍历,
    • 同时用i,j,k等分别读取元组( )里的元素
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
d=[10,11,12]
zz=zip(a,b,c,d)

x,y,z = zz # 
print(x)
print(y)
print(z)

for i , j , k , m in zip(a,b,c,d):
    print(i,j,k,m)

输出:
(1, 4, 7, 10)
(2, 5, 8, 11)
(3, 6, 9, 12)

1 4 7 10
2 5 8 11
3 6 9 12
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
d=[10,11,12]
zz=zip(a,b,c,d)

# x,y,z = zz # 此处不能再读取zz,否则下面无法使用zz,使用时,为空列表,

若上面想使用zz,下面还要使用则重新zip打包,再zip(*zip((a,b,c,d))  

# for i , j , k  in zip(*zip(a,b,c,d)):
for i , j , k  in zip(*zz):
    print(i,j,k)

输出:
1 2 3
4 5 6
7 8 9
10 11 12
  •  zip(*zz) 为逆过程:类似矩阵的转置

    a=[1,2,3]
    b=[4,5,6]
    c=[7,8,9]
    d=[10,11,12]
    zz=zip(a,b,c,d)
    
    print(list(zip(*zz)))
    输出:[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]
    因变使用list(),输出结果是由元组组成的列表
    =========================================
    a=[1,2,3]
    b=[4,5,6]
    c=[7,8,9]
    d=[10,11,12]
    zz=zip(a,b,c,d)
    
    # print(list(zip(*zz))) # 若下面再次使用zz时此行需注释掉
    x,y,z,s = zip(*zz)
    print(x)
    print(y)
    print(z)
    print(s)
    
    输出:
    (1, 2, 3)
    (4, 5, 6)
    (7, 8, 9)
    (10, 11, 12)
    

3 打包解包

      (1)过程:

                逐一取出每个列表里的第i个元素,组成第i个新元组,

                当列表不等长时,剩余的元素就被舍弃。     

                zip(*zip())类似于矩阵的转置操作   

        (2)打包的元素可以为:

                列表[]         元组()         集合{ }

        

        (3)当打包元素为集合{},且{}中的元素为True False None 数字时:

                会自动对多余的True或False进行舍弃,最终zip()里只能保留最多四种值:True False None 数字,

                数字1被认为True,0被认为False,但当同时存在True与1,舍1,同时存在False与0,舍0,当True与1或False与0不同时存在,则保留1或0。

                而其它非0数字均被识别,但是组合位置不一定。

集合 {}设置不同的数字演示

# {}设置不同的数字演示
aa = [1,2,3,4,5]
bb = ["11","22","33","44",'55']
set = {True,False,None,True,0}
zz = zip(aa,bb,set)  # 打包
print(list(zz))

输出:
[(1, '11', False), (2, '22', True), (3, '33', None)]
 
set = {True,False,None,True,1}
输出:
[(1, '11', False), (2, '22', True), (3, '33', None)]

set = {True,False,None,True,2}
输出:
[(1, '11', False), (2, '22', True), (3, '33', 2), (4, '44', None)]

set = {True,False,None,True,6}
输出:
[(1, '11', False), (2, '22', True), (3, '33', None), (4, '44', 6)]

set = {True,False,None,True,-1}
输出:
[(1, '11', False), (2, '22', True), (3, '33', None), (4, '44', -1)]

集合{}设置 0和1与False与True的演示

aa = [1,2,3,4,5]
bb = ["11","22","33","44",'55']
set = {False,False,None,False,0}
zz = zip(aa,bb,set)  # 打包
print(list(zz))
输出:
[(1, '11', False), (2, '22', None)]

set = {False,False,None,False,1}
输出:
[(1, '11', False), (2, '22', 1), (3, '33', None)]
aa = [1,2,3,4,5]
bb = ["11","22","33","44",'55']
set = {True,True,None,True,1}
zz = zip(aa,bb,set)  # 打包
print(list(zz))

输出:
[(1, '11', True), (2, '22', None)]

set = {True,True,None,True,0}
输出:
[(1, '11', 0), (2, '22', True), (3, '33', None)]
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值