Python中zip函数用法

背景:

在做深度学习数据预处理的过程中经常会遇到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笔记

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值