Zip()函数:
#参数说明:iterabl – 一个或多个迭代器;
zip([iterable, …])
zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。(在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换)
不废话直接上实例:
my_list = [11,12,13]
my_tuple = (21,22,23)
print([x for x in zip(my_list,my_tuple)])
my_dic = {31:2,32:4,33:5}
print([x for x in zip(my_dic)])
my_pychar = "python"
my_shechar = "shell"
print([x for x in zip(my_pychar,my_shechar)])
my_list1 = [11,12,13]
my_tuple1 = (21,22,23)
print(list(zip(my_list1,my_tuple1)))
'''输出结果:
[(11, 21), (12, 22), (13, 23)]
[(31,), (32,), (33,)]
[('p', 's'), ('y', 'h'), ('t', 'e'), ('h', 'l'), ('o', 'l')]
[(11, 21), (12, 22), (13, 23)]
'''
#在运行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)]
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
u = zip(*xyz)
print(u)
print(list(u))
'''输出结果:
<zip object at 0x000001FD35348EC8>
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
'''
#实现矩阵转置
x=[[1,2,3],[4,5,6],[7,8,9]]
y = zip(*x)
print(list(y))
'''输出结果:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
'''
#构造字典:
x = ['a', 'b', 'c']
y = ['x', 'y', 'z']
z = zip(x, y)
d = dict(z)
print(d)
'''输出结果:
{'a': 'x', 'b': 'y', 'c': 'z'}
'''
#其他使用:
# [x] * 3生成一个列表的列表,它有3个元素,[x, x, x]
x = [1, 2, 3]
r = zip(* [x] * 3)
print(list(r))
# [iter(a)]表示每次取一个元素,[iter(a)] * 2表示迭代两次,每次步长为2,也即是每次取了三个元素,迭代完就变成了[1, 3, 5], [2, 4, 6],然后再使用zip()就变成了[(1, 2), (3, 4), (5, 6)]
a = [1, 2, 3, 4, 5, 6]
b = zip(*([iter(a)] * 2))
print(list(b))
'''输出结果:
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
[(1, 2), (3, 4), (5, 6)]
'''
实际编程使用例子:
import requests
from lxml import etree
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
# 请求拿到网站数据
response = requests.get("xxx")
# 抽取想要数据 图片标题 图片链接
xml = etree.HTML(response.text) # 整理成xml文档对象
tit_list = xml.xpath('//img[@class="xx"]/@alt')
src_list = xml.xpath('//img[@class="xx"]/@data-original')
#for xx in zip()
for tit, src in zip(tit_list, src_list):
# 下载图片
response = requests.get(src, headers=headers)
fileName = "phone\\" + tit + ".jpg"
print("正在保存图片文件:" + fileName)
# 保存图片
with open(fileName, "wb") as f:
f.write(response.content)