目录
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', '克里马擦')]
如果错误,还望指正。