Python zip()函数的用法

来源:互联网 发布:粉笔申论智能批改 知乎 编辑:程序博客网 时间:2024/06/07 23:16

Python函数式编程之zip()

zip()
zip()函数接受0个或多个序列作为参数,返回一个tuple列表。
zip()函数具体的工作机制是,将每个列表中同一位置的元素取出来组成一个元组,存放到一个列表中,然后返回这个列表。举例说明:

>>> x = [1,2,3]>>> y = ['a','b','c']>>> z = [4,5,6]>>> zip_xyz = zip(x, y, z)>>> print zip_xyz[(1, 'a', 4), (2, 'b', 5), (3, 'c', 6)]

对于长度不同的seq,zip()函数又怎么处理呢?

>>> a = [1,2,3]>>> b = [4,5,6,7]>>> zip_ab = zip(a, b)>>> print zip_ab[(1, 4), (2, 5), (3, 6)]

从上面的例子可以看出,当seq的长度不一致时,zip()会以最短的那个seq为主,进行处理,然后将多余的舍弃掉。
zip()对只有一个seq的处理:

>>> c = ['a', 'b', 'c']>>> zip_c = zip(c)>>> print zip_c[('a',), ('b',), ('c',)]

我们再看一个例子

>>> a = [1, 2, 3]>>> b = ['a', 'b', 'c']>>> zip_ab = zip(ab)>>> zip_ab = zip(a,b)>>> un_zip = zip(*zip_ab)>>> print un_zip[(1, 2, 3), ('a', 'b', 'c')]

一般认为这是一个unzip过程,工作原理如下:
在运行zip(*zip_ab)之前,zip_ab的值是:[(1, ‘a’), (2, ‘b’), (3, ‘c’)]
而zip(*zip_ab)就等价于zip((1, ‘a’), (2, ‘b’), (3, ‘c’))
所以得出结果:[(1, 2, 3), (‘a’, ‘b’, ‘c’)]

再来看一个例子:

>>> x = [1,'a','b']>>> zip_rx = zip(* [x] * 3)>>> print zip_rx[(1, 1, 1), ('a', 'a', 'a'), ('b', 'b', 'b')]

看着这个结果是不是有点晕啊?嘿嘿,别着急,让我来给你理顺了它:
首先 [x]生成一个列表的列表:[[1, ‘a’, ‘b’]],这个列表中只有一个元素[1,’a’,’b’]
其次[x] * 3,表示将列表中的元素打印三次,即生成了含有三个元素的列表:
[[1, ‘a’, ‘b’], [1, ‘a’, ‘b’], [1, ‘a’, ‘b’]]
最后是zip(* [x] * 3)就等价于
zip([1, ‘a’, ‘b’], [1, ‘a’, ‘b’], [1, ‘a’, ‘b’]),到这里我想结果很明确了吧!

注意:在函数调用中,使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数,但前提是对应函数必须支持不定个数的位置参数。

0 0
原创粉丝点击