背景:
在做深度学习数据预处理的过程中经常会遇到zip函数,现在好好的学习的一波。
1. zip函数:
1.1 定义:
建议的解决方案是引入一个新的内置序列发生器功能,可在builtin模块。此功能被称为zip和具有以下定义:
zip(seqa, [seqb, [...]])
zip()采用一个或多个序列并将它们的元素编织在一起,就像map(None,…)对长度相等的序列一样。 当最短的序列耗尽时,编织停止。
返回值:
zip()返回一个真正的Python列表,就像map()一样。
1.2 zip函数使用
下面引入stackoverflow上面提出的一个问题,来引出zip如何使用。
Transpose/Unzip Function (inverse of zip)?
1.2.1 问题提出:
我有一个2元组元组的列表,我想将它们转换为2个列表,其中第一个元素包含每个元素中的第一个元素元组,和第二个列表保存第二个项目。
比如:
original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
# and I want to become...
result = (['a', 'b', 'c', 'd'], [1, 2, 3, 4])
请问有很好的python内建函数可以处理这个问题吗?
1.2.2 高票回答:
zip是它自己的反面! 只要您使用特殊*操作符。
>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
通过zip函数我们就可以简单的达到我们预期希望输出的结果了。
1.2.3 zip使用注意
如果您的列表长度相同,您会发现zip函数运行良好,但列表长度如何不一样,您可以看到如下示例:
original = [('a', 1), ('b', 2), ('c', 3), ('d', 4),('e',)]
out = zip(*original)
list = [] # so, we need to show it in list
for i in out:
list.append(i)
print(list)
输出:
[('a', 'b', 'c', 'd', 'e')]
也就是说当我们二个元组数据个数不对称的时候,直接使用zip函数可能会出现问题了。
我们如何解决这个问题了?
我们可以简单使用map函数帮助我们解决这个问题。
out = map(None, *[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', )])
输出:
[('a', 'b', 'c', 'd', 'e'), (1, 2, 3, 4, None)]
1.2.4 实际中我们这样使用zip函数
在实践中,我喜欢在我的程序中使用zip(* iterable)(这是您要查找的代码片段),如下所示:
def unzip(iterable):
return zip(*iterable)
In conclusion:
1.3 zip函数简单总结:
1.3.1 zip
X=[1,2,3,4]
Y=['a','b','c','d']
XY=zip(X,Y)
# Resulting in:
Out: [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
1.3.2 Unzip
x,y=zip(*XY)
参考文章:
1. python官方zip函数说明1
2. python官方zip函数说明2
3. stackoverflow上zip问题
4. 本篇文章ipython笔记