Python zip函数详解+和izip和zip_longest的比较辨析

目录

 

1. zip()函数

1.1 zip()函数的用法

1.2 zip()函数的应用

1.3 *zip()的用法

2. itertools.izip()

3. itertools.zip_longest()


1. zip()函数

zip是Python的内置函数,通过help查看其使用方式如下:

help(zip)

Help on built-in function zip in module __builtin__:

zip(...)

  zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

zip([seq1, ...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。若传入参数的长度不等,则返回列表的长度和参数中长度最短的对象相同。

1.1 zip()函数的用法

查看具体使用方式:

①zip()函数单个参数

list1 = [1, 2, 3, 4]
tuple1 = zip(list1)
list2=list(tuple1)
print(tuple1) #<zip object at 0x0000021167002E08>
print(list2) #[(1,), (2,), (3,), (4,)]

当zip()函数有两个参数时:zip(a,b)。zip()函数分别从a和b依次各取出一个元素组成 元组,再将依次组成的元组组合成一个新的迭代器–新的zip类型数据,当a和b具有相同维数时,一一对应即可; 当a与b的维数不同时,取两者较小的维数,进行组合,多余的被舍去;

②zip()函数有2个参数

list1 = ["A", "B", "C", "D", "E"]  #len = 5
list2 = ["a", "b", "c", "d", "e"]  #len = 5
list3 = [1, 2, 3, 4]  #len = 4
print( list( zip(list1, list2) ) )  #[('A', 'a'), ('B', 'b'), ('C', 'c'), ('D', 'd'), ('E', 'e')]
print( list( zip(list1, list3) ) )  #[('A', 1), ('B', 2), ('C', 3), ('D', 4)]
#返回的元组的长度是所有输入序列中最短的

1.2 zip()函数的应用

利用zip()函数完成矩阵的点乘、相加和相减。

m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]
#矩阵点乘
mat_pointmul = [ x * y for a, b in zip(m, n) for x, y in zip(a, b)]
print(mat_pointmul) #[2, 4, 6, 12, 15, 18, 28, 32, 36]
#矩阵相加,相减同理
mat_sum = [ x + y for a, b in zip(m,n) for x, y in zip(a, b)]
print(mat_sum)  #[3, 4, 5, 7, 8, 9, 11, 12, 13]

1.3 *zip()的用法

list1 = ["A", "B", "C", "D", "E"]  #len = 5
list2 = ["a", "b", "c", "d", "e"]  #len = 5
temp=zip(list1, list2)
#print(list(temp))  #[('A', 'a'), ('B', 'b'), ('C', 'c'), ('D', 'd'), ('E', 'e')]
#这句写了的话,后面  a,b = zip(*temp) 就报错 ValueError: not enough values to unpack (expected 2, got 0)
a, b = zip(*temp)
print(a,b) #('A', 'B', 'C', 'D', 'E') ('a', 'b', 'c', 'd', 'e')

#或
print(list(zip(*zip(list1, list2)))) #[('A', 'B', 'C', 'D', 'E'), ('a', 'b', 'c', 'd', 'e')]

#或
l1, l2 = zip(*zip(list1,list2))
print(l1,"\t",l2)  #('A', 'B', 'C', 'D', 'E')   ('a', 'b', 'c', 'd', 'e')
x=[5,6,7]
print([x])  #[[5, 6, 7]] [x]生成一个列表的列表,它只有一个元素x
print([x]*3)  #[[5, 6, 7], [5, 6, 7], [5, 6, 7]]
print(list(zip(* [x] * 3)))  #[(5, 5, 5), (6, 6, 6), (7, 7, 7)]
#zip(* [x] * 3)等价于zip(x, x, x)

2. itertools.izip()

izip()是属于itertools库的一个函数,在Python3中已经取消(AttributeError: module 'itertools' has no attribute 'izip')。

分析其功能后,可以清楚的知道为什么被取消。

内置函数zip()在Python2和Python3中有不同的返回对象,在Python2中zip()直接返回一个列表,在Python3中zip()返回一个迭代器。相对而言返回迭代器的速度要快很多。为此鄙人做了实验,但是运行Python2的时候,电脑被卡死,垃圾Python2。

Itertools.izip()就是返回一个迭代器。那么它在Python3中就失去了存在意义,所以被取消。Python3替代Python2是大势所趋,所以知道有这么个东西就够了。

3. itertools.zip_longest()

使用最长的迭代器来作为返回值的长度,并且可以使用fillvalue来制定那些缺失值的默。

import itertools
list1 = ["A","B","C","D","E"]  #len = 5
list2 = ["a", "b", "c", "d","e"]  #len = 5
list3 = [1, 2, 3, 4]  #len = 4

当参数长度一致时和zip一样。

temp = itertools.zip_longest(list1,list2)
print(temp)  #<itertools.zip_longest object at 0x00000243EB0128B8>
print(list(temp))  #[('A', 'a'), ('B', 'b'), ('C', 'c'), ('D', 'd'), ('E', 'e')]

当参数长度不一时,zip和较短的保持一致,itertools.zip_longest()和较长的保持一致。

print(list(itertools.zip_longest(list1, list3)))
#[('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', None)]
print(list(zip(list1, list3)))
#[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

可以使用fillvalue来制定那些缺失值的默认值。

print(list(itertools.zip_longest(list1, list3,fillvalue = "克里马擦")))
#[('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', '克里马擦')]

如果错误,还望指正。

  • 26
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值