目录

0. 前言

1. zip()有什么好处?

2. zip基本使用方法

2.1 语法

2.2 使用例

3. 反向操作:unzip

4. zip_longest()


0. 前言

本文简单介绍python中的zip()方法的使用,并相应介绍与之相关联的itertools模块中的zip_longest()。

简而言之,Python中的zip()方法是用于提高并行迭代(parallel iteration)的效率的。

1. 基本的iterable遍历方法

常规的遍历一个iterables的基本做法有以下两种:

weekdays = ['Monday','Wendsday','Tuesday','Thursday','Friday','Saturday','Sunday']
for wd in weekdays:print(wd,end=', ')
print('\n')
for k in range(len(weekdays)):print(weekdays[k],end=', ')
print('\n')    

当我们有两个或者多个长度相等的iterables,需要遍历并每次从各iterables中取一个元素(序号对应)进行处理呢?我们可以这样做:

weekdays = ['Monday','Wendsday','Tuesday','Thursday','Friday','Saturday','Sunday']
weekdays_chinese = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日' ]
for k in range(len(weekdays)):print(weekdays[k],' --> ', weekdays_chinese[k])    

但是,这种方法只在多个iterables的长度相同时才能行得通。如果不一定相等的话,就需要提前进行比较并选取其中最小的长度作为遍历范围,否则的话就可能出错。比如说,

weekdays = ['Monday','Wendsday','Tuesday','Thursday','Friday','Saturday','Sunday']
weekdays_chinese = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六' ]
min_len = min(len(weekdays),len(weekdays_chinese))
for k in range(min_len):print(weekdays[k],' --> ', weekdays_chinese[k])    

如果,需要进行并行迭代处理的各iterables的长度在程序运行过程中还会动态发生变化的话,情况就更加复杂了。

2. zip基本使用方法

zip()方法提供了很方便的进行并行迭代的工具。

2.1 语法

        Syntax :  zip(*iterators)

        Parameters : Python iterables or containers ( list, string etc )

        Return Value : Returns a single iterator object, having mapped values from all the containers.

        根据python docs, zip()用于创建将多个iterables中的元素聚合起来使用的迭代器(iterator).
        1. 返回一个元组的迭代器(iterator of tuples), 第i个元组包含各输入iterables的第i个元素.
        2. 迭代器在最短的输入iterable用完时停止 -- 因此不必担心各iterable长度不同时会报错
        3. 如果输入只有一个iterable参数的话, 它就返回以1-tuple为元素的迭代器.
        4. 如果没有指定参数的话,返回的是空的迭代器

2.2 使用例

例1:

weekdays = ['Monday','Wendsday','Tuesday','Thursday','Friday','Saturday','Sunday']
weekdays_chinese = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六' ]
zipPair = zip(weekdays, weekdays_chinese)
print(zipPair)
print(list(zipPair))

输出:

<zip object at 0x000001C7896A55C0>
[('Monday', '星期一'), ('Wendsday', '星期二'), ('Tuesday', '星期三'), ('Thursday', '星期四'), ('Friday', '星期五'), ('Saturday', '星期六')]

注意,在这个例子中,两个输入列表的长度是不相同,zip()进行了判断并按照较短的那个进行处理。

zip()返回的是一个zip对象,第一条print()打印的结果是它的指针信息。第二条print()将它映射为列表再打印出来。

例2:多个iterables输入

weekdays = ['Monday','Wendsday','Tuesday','Thursday','Friday','Saturday','Sunday']
weekdays_chinese = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日' ]
weekdays_japanese = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日','日曜日' ]
zipTriple = zip(weekdays, weekdays_chinese, weekdays_japanese)
print(list(zipTriple))

输出:[('Monday', '星期一', '月曜日'), ('Wendsday', '星期二', '火曜日'), ('Tuesday', '星期三', '水曜日'), ('Thursday', '星期四', '木曜日'), ('Friday', '星期五', '金曜日'), ('Saturday', '星期六', '土曜日'), ('Sunday', '星期日', '日曜日')]

例3:如果zip()的输入参数只有一个iterables或者甚至没有呢?好吧,谁闲的慌会这么做呢?

a = [1,2,3,4,5]
print(list(zip(a)))
print(list(zip()))

[(1,), (2,), (3,), (4,), (5,)]
[]

3. 反向操作:unzip

既然可以将多个iterables中的元素聚合到一起来使用,那能不能将它们分解开来呢?太能了!用zip(*zip_object)的方式将一个由zip()生成的zip object传递给zip(),注意前面要加一个"*"号,就可以实现将zip object又还原成各个iterables了。

zipTriple = zip(weekdays, weekdays_chinese, weekdays_japanese)
wk1, wk2, wk3 = zip(*zipTriple)
print(wk1)
print(wk2)
print(wk3)

输出:

('Monday', 'Wendsday', 'Tuesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
        ('星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日')
        ('月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日')

4. zip_longest()

前面说到当多个输入iterables的长度不相等的时候,zip会按照最小的长度进行迭代处理。但是,如果需要按照最长的那个进行迭代处理,那怎么办呢?

有办法,在itertools模块中提供了一个叫做zip_longest()的方法,就是用于弥补zip()这一短板的。如下例所示:

import itertools as it
fruits = ['apple', 'banana', 'melon', 'strawberry']
prices = [10, 20, 30]
print(list(it.zip_longest(fruits, prices)))

输出:[('apple', 10), ('banana', 20), ('melon', 30), ('strawberry', None)]

由于prices中少了一项,python缺省地补了个None跟fruits中的最后一项配对。

当然你可以加上你想要的配对项,比如:

fruits = ['apple', 'banana', 'melon', 'strawberry']
prices = [10, 20, 30]
print(list(it.zip_longest(fruits, prices, fillvalue='Sold out')))

输出:[('apple', 10), ('banana', 20), ('melon', 30), ('strawberry', 'Sold out')]

通过zip_longest()的可选项输入参数“fillvalue”指定了在长度不足时的配对项“Sold Out”。当然在这个例子中,这个指定的配对项只适合于prices列表较短的情况。

Hope you enjoy this blog!

关于itertools模块如果想知道得更多,还可以参阅:python itertools详解及使用示例https://blog.csdn.net/chenxy_bwave/article/details/120110095?spm=1001.2014.3001.5501https://blog.csdn.net/chenxy_bwave/article/details/120110095?spm=1001.2014.3001.5501

Python zip, unzip, zip_longest的用法相关推荐

  1. Python zip() 与 map()的用法

    zip(): 将多个可迭代对象按序取出相同索引的元素(当长度最小的对象为准), 组成一个个元组,并封装在一个可迭代对象中 ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:57981 ...

  2. zip函数的用法python_Python zip函数 python zip函数的用法

    python 当中的zip( )函数到底是干嘛的? zip([1,2,3],['a','b','c']) 结果是 [(1, 'a'), (2, 'b'), (3, 'c')] 就是依次取出每一个数组的 ...

  3. python zip函数转制_Python zip函数及用法

    zip() 函数是 Python 内置函数之一,它可以将多个序列(列表.元组.字典.集合.字符串以及 range() 区间构成的列表)"压缩"成一个 zip 对象.所谓" ...

  4. Python zip*用法(一行代码实现矩阵的旋转)

    1.ZIP函数 ZIP函数是Python中的一个内置函数,在Python 2.X的版本中返回的是一个列表,Python 3.X版本中返回的是一个zip迭代器对象. ZIP函数的具体用法 a = [1, ...

  5. python zip函数_相当于Python的zip函数

    下面是一个更时髦的ECMAScript 6版本:zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c])) 插图等价物到Python{z ...

  6. zip unzip命令行_Linux / Unix中的Zip和Unzip命令

    zip unzip命令行 In this guide, we will focus on zip and unzip commands in Linux. zip command is a utili ...

  7. Python zipfile – Python ZIP

    Python zipfile module helps us in working with zip files. Today we will learn how to read zip archiv ...

  8. Linux压缩命令gzip、tar、zip的区别和用法

    Linux压缩命令gzip.tar.zip的区别和用法 Linux系统中常用的压缩命令有gzip.tar.zip等. gzip命令是一个压缩文件的工具,常用参数有: -c : 把压缩后的文件输出到标准 ...

  9. python中循环语句的用法,python几种循环方式

    python中while循环的用法是什么? python while循环语句:while 判断条件(condition):执行语句(statements)--执行语句可以是单个语句或语句块. 判断条件 ...

  10. 实用的Linux 安装 zip unzip

    Linux 安装 zip unzip 1.apt-get 安装 apt-get install zip 2.yum 安装 yum install -y unzip zip 命令实例 1.把/home目 ...

最新文章

  1. 你有一张世界互联网大会的门票待领取!数字经济人才专场报名开启
  2. linux 图形用户界面 x window system 简介
  3. 9月19日下午JavaScript数组冒泡排列和二分法
  4. 利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster
  5. POJ1220(高精度进制转换)
  6. 香肠派对电脑版_香肠派对先行服s7赛季下载-香肠派对先行服s7赛季最新版下载...
  7. html标签info,HtmlTrInfo 元素
  8. ARM CORTEX-M0 权威指南 英文
  9. xshell密钥远程登录管理服务器
  10. 讲解wpe抓包,封包
  11. 【eoeAndroid社区索引】Android二维码知识汇总
  12. BP神经网络代码实现
  13. (BLE)蓝牙抓包(1) -nRF-sniffer和wireshark
  14. TIMESTAMP和DATETIME的区别以及选择
  15. vue 实现倒计时功能
  16. 图的表现形式第一篇(Java实现)
  17. css实现简单的电影院选座功能
  18. Eclipse使用指南
  19. 清华-计算机-考研-精华帖-汇总
  20. 机器性能测试与显卡价格报表

热门文章

  1. 摄像头采集图像本地HDMI输出延迟测试
  2. Mac外接显示器默认30hz
  3. 千锋深圳Java培训分享:MySQL详细知识点
  4. 软件架构设计杂记: 好作品是改出来的,好的代码是不断重构打磨出来的, 心性是历经艰难困苦修炼出来的
  5. 几种 FPGA 芯片的工艺结构
  6. FPGA芯片内两种存储器资源
  7. DSP28335的eCAP模块
  8. LEF和GDS匹配问题
  9. 智能眼镜的两种显示方式
  10. 深度学习数据增强方法总结