python语言,如何理解zip函数?如何打印zip类型数据?
发布于 作者:苏南大叔 来源:程序如此灵动~在python
语言里面,有很多奇怪的数据类型,其中一个就是zip
数据类型。据苏南大叔的理解,它和平时所说的zip
压缩格式,还是不一样的。苏南大叔的理解是:zip
类型就是个类似dict
类型的数据类型。具有的公用就两个:整理数据+封包数据。区别于dict
类型的功能就是封包,封起来别人看不到。由于解开数据并没有门槛,用于数据加密解密,似乎也是没有啥效果的。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述python
语言里面,如何使用zip()
和*zip()
,对数据进行封装和解包。测试环境:win10
,python@3.6.8
。本文对于zip
类型的解读,都是苏南大叔自己的想法,如有不妥,还请指正。
普通数据封包
正如苏南大叔所说的,和这个zip
最类似的是dict
。数据都是成组出现的,通过zip
给缝合到一起。
def get_zip(debug=False):
a = ["苏南", "大叔", "博客"] # list
b = ("唐山", "北京", "燕郊") # tuple
z = zip(a, b)
if (debug):
print(type(a),type(b),type(z))
print(list(z))
return z
z = get_zip(True)
输出:
<class 'list'> <class 'tuple'> <class 'zip'>
[('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊')]
上面这个例子中,zip
数据类型把list
数据类型和tuple
数据类型缝合到了一起。zip
类型本质上还是个迭代器,所以它具有特征:
- 无法直接输出,但是可以转类型输出。
- 一用即废,无法第二次使用。所以,可以考虑保存到别的类型变量。
z = get_zip()
print(z)
for i in z:
print(i,type(i)) # 'tuple'
输出:
<zip object at 0x000002184002E4C8>
('苏南', '唐山') <class 'tuple'>
('大叔', '北京') <class 'tuple'>
('博客', '燕郊') <class 'tuple'>
输出方式之*zip
官方推荐的方式是使用*zip
来对zip
进行解包,这个函数是不是非常奇怪?星号其实并不是函数名的一部分,实际上是个用于迭代器的解包运算符。这个问题,待后续讨论。
a = ["苏南", "大叔", "博客"] # list
b = ("唐山", "北京", "燕郊") # tuple
c = ("来自", "住在", "曾经") # tuple
print(*zip(a,b,c))
# ('苏南', '唐山', '来自') ('大叔', '北京', '住在') ('博客', '燕郊', '曾经')
这个*zip
很不好用,条件苛刻。
输出方式之迭代输出
可以迭代输出:
z = get_zip()
for i in z:
print(i,type(i))
输出:
('苏南', '唐山') <class 'tuple'>
('大叔', '北京') <class 'tuple'>
('博客', '燕郊') <class 'tuple'>
转换类型输出【推荐】
对zip
类型可以转化为传统的已知类型,比如list
/tuple
/dict
。
z = get_zip()
print(list(z))
# [('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊')]
z = get_zip()
print(tuple(z))
# (('苏南', '唐山'), ('大叔', '北京'), ('博客', '燕郊'))
z = get_zip()
print(dict(z))
# {'苏南': '唐山', '大叔': '北京', '博客': '燕郊'}
z = get_zip()
print(set(z))
# {('博客', '燕郊'), ('苏南', '唐山'), ('大叔', '北京')}
打包的数据【注意set类型】
zip
不但可以打包两组数据,也可以打包很多个数据,一一对应即可。如果某条数据的成员多,那么会自动舍弃。虽然支持打包set
数据,但是由于set
数据的天生去重并且无序性,打包的结果会并不具有唯一性。所以,最好不要试图处理set
数据(也就是大括号包裹的数据)。
a = ["苏南", "大叔", "博客"] # list
b = ("唐山", "北京", "燕郊") # tuple
c = {"ts", "bj", "yj"} # set
print(*zip(a,b,c))
多次输出可以发现,涉及到set
为输入类型的时候,会有随机输出的情况。
('苏南', '唐山', 'yj') ('大叔', '北京', 'ts') ('博客', '燕郊', 'bj')
('苏南', '唐山', 'bj') ('大叔', '北京', 'ts') ('博客', '燕郊', 'yj')
对于输出强制转化为set
的情况,输出的内容也是无序的。但是,并不影响效果。
循环取值tuple
import numpy as np
x = np.arange(0, 3)
y = x * x
print(x, type(x))
print(y, type(y))
for xy in zip(x, y):
print(xy, type(xy))
相关链接
- https://newsn.net/say/python-tuple.html
- https://newsn.net/say/python-def.html
- https://newsn.net/say/python-dir.html
- https://newsn.net/say/python-set-diff.html
总结
python
这些数据类型,总是让人眼花缭乱,让人措不及防。更多python
经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。