目录
一、zip()函数
语法:
zip([iterable, ...])
iterable:可迭代对象,zip()函数可以传入一个或多个可迭代对象
示例:将多个可迭代序列中的元素按照索引位置提取形成新元组,多个序列长度不同时,zip函数会采用“取短截长”策略按照最短序列长度提取数据元素,新生成的多个元组构成返回对象。zip()函数对于字典操作时只取键。
#将多个序列中的元素对齐打包成新元组
la = [1,2,3,4]
lb = ['a','b','c']
lc = {'apple':4,'orange':5,'pear':6,'strawberry':7}
result = zip(la,lb,lc) # 返回zip对象
print(list(result)) # [(1, 'a', 'apple'), (2, 'b', 'orange'), (3, 'c', 'pear')]
二、zip(*)函数
*号在函数实参传递阶段,可以将实参列表拆解成一个个独立元素,然后按照顺序向函数传递参数。函数参数类型的详细介绍可以参考本人写的另外一篇博文(https://blog.csdn.net/li1784506/article/details/140251433?spm=1001.2014.3001.5502)。
data_list = [1,2,3]
print(data_list) #输出:[1, 2, 3]
print(*data_list) #输出:1 2 3
解释完'*'号的用法后重新审视zip(*)的使用代码就很容易理解其本身原理,将内部结果拆包成独立元组后重新合并。例如:zip(*zip(x,y))先分析内部函数zip(x,y)是将两个可迭代对象中的元素按索引位置提取组成新元组并封装到一个对象中。*zip(x,y)是将封装的数据拆成一个个单独的元组。
x = [1,2,3]
y = [4,5,6]
print(list(zip(x,y))) # [(1, 4), (2, 5), (3, 6)]
print(*zip(x,y)) # 解包操作: (1, 4) (2, 5) (3, 6)
zip()对拆解开的元组再次实施处理,把各元组中的相对应索引位置元素取出合并,形成新的zip对象。
a,b = zip(*zip(x,y)) # 等价于zip((1, 4), (2, 5), (3, 6))
print(a) #(1, 2, 3)
print(b) #(4, 5, 6)
三、zip()和zip(*)函数工程项目使用
3.1 zip()函数的项目使用
在实际的应用场景中,zip函数主要用于提取多个序列中的对应索引位置的元素,可直接使用zip函数+for循环提取两个序列的对应位置数据。
# 利用zip+for循环直接提取序列
la = [1,2,3,4]
lb = ['a','b','c']
for x,y in zip(la,lb):
print(f'{x}--{y}',end=' ')
#结果为: 1--a 2--b 3--c
3.2 zip(*)函数的项目使用
zip(*)函数可以按照上面的讲解理解,先解包内部数据变成独立元素,随后重新对解包的数据按索引位置提取元素生成新元组。新生成的序列结果可用for循环显示也可直接赋值给相同数量的变量。
res = [(1, 'a'), (2, 'b'), (3, 'c')]
#解包zip对象恢复两个序列对应位置元素。
(1)用for循环显示数据
for m in zip(*res):
print(m)
###显示###
(1, 2, 3)
('a', 'b', 'c')
(2)用相同数量的变量赋值方式显示数据
x,y = zip(*res)
print(x) #x: (1, 2, 3)
print(y) #y: ('a', 'b', 'c')
3.3 综合实战项目举例
设置图像数据集当中的通道数、长、宽为所有图像当中的最大值。并对原始图像数据进行填充使所有图像格式能够统一方便深度模型批量操作。
import torch
image_1 = torch.randn(3,224,224)
image_2 = torch.randn(3,384,360)
image_3 = torch.randn(3,405,240)
images = [image_1,image_2,image_3]
max_size = tuple(max(m) for m in zip(*[img.shape for img in images ])) #元组推导式返回生成器想输出结果常使用list(...)或tuple(...),也可用for循环。
print(max_size) #(3, 405, 360)
batch_shape = (len(images),) + max_size #pytorch批量处理增加图像数量维度
batched_imgs = images[0].new(*batch_shape).fill_(0) #创建新图像数据集合内存
for img, pad_img in zip(images, batched_imgs):
pad_img[..., :img.shape[-2], :img.shape[-1]].copy_(img)
for img in batched_imgs:
print(img.shape)
###显示结果###
torch.Size([3, 405, 360])
torch.Size([3, 405, 360])
torch.Size([3, 405, 360])