- 一 、 zip()函数解释:
- 1. 只有一个参数序列的情况:
- 2. 两个或多个参数的情况
- 3. 序列截断的情况
- 4. zip()的返回值
- 二、 * 的使用
- 三、 zip() 、zip(*) 与*zip()函数
- 1. zip(keys, values)
- 2. 用序列解包同时遍历多个序列(for x,y in zip(keys, values):)
- 3. zip(*)
- 4. *zip()
zip(keys, values)函数为打包函数。
zip函数是将输入的多个(包含一个)参数序列中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
列表第i位的元素是由每一个参数序列中的第i位构成的一个元组,且返回的列表会自动截断为参数序列的最短长度。
举例:
>>>a=[1,2,3] >>>aa=zip(a) >>>print(aa) [(1,),(2,),(3,)]
即将单个元素打包成元组。
2. 两个或多个参数的情况>>>a=[1,2,3] >>>b=[4,5,6] >>>c=zip(a,b) >>>print(c) [(1,4),(2,5),(3,6)]
>>>m=[[1,1],[4,5]] >>>n=[[1,2],[2,3]] >>>print(list(zip(m,n))) [([1, 1], [1, 2]), ([4, 5], [2, 3])]
将参数序列中对应的元素打包成一个个元组,例如上述代码中序列a中的第一个元素为1,对应的序列b中的第一个元素为4,故将1和4打包成一个元组,成为新列表c中的第一个元素。
3. 序列截断的情况>>>a[1,2] >>>b=[1,2,3] >>>print(zip(a,b)) [(1,1),(2,2)] #以最短长度截断
上述输入的参数列表中最短序列为a,只有两个元素,故到序列b中的第三个元素3时被截断,形成的新序列为两个长度的新序列(注:(1,1)为一个长度)。
4. zip()的返回值zip函数的返回对象类型是一个zip类型,我们直接来输出返回值的结果,实际上是返回了这个zip对象在内存中的存储位置。
# 定义三个列表
>>>a = [1, 2, 3]
>>>b = [4, 5, 6]
>>>c = zip(a, b)
>>>print("c类型%s" % type(c))# 输出zip函数的返回对象类型
c类型
>>>printc)# 输出c
# c这个zip对象在内存中的存储位置
如需展示列表,需手动 list() 转换;如需展示字典,需手动 dict() 转换。下面我们将结果c用列表的形式展示出来:
>>>print(list(c)) [(1, 4), (2, 5), (3, 6)]二、 * 的使用
*是对序列进行解包(可以理解为从外向内去括号)。在实参面前加上一个 * 号进行序列解包。或在实参字典前加两个星号**进行解包。
例如:
>>> print(*[1,2,3,4],4,*(5,6))
1 2 3 4 4 5 6
>>> *range(4),4
(0, 1, 2, 3, 4)
>>> {*range(4),4,(5,6,7,8,9)}
{0, 1, 2, 3, 4, (5, 6, 7, 8, 9)}
>>> {*range(4),4,*(5,6,7,8,9)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {'x':1, **{'y':10}}#实参字典解包
{'x': 1, 'y': 10}
>>>*[['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']]
['a1', 'a2', 'a3'] ['b1', 'b2', 'b3']
三、 zip() 、zip() 与zip()函数
1. zip(keys, values)
序列解包也可以适用于列表和字典呢,字典的话默认是对“key”进行操作, 如需对“key”-“value”进行操作则需要使用字典的items()方法进行操作。“value”进行操作的话就使用values()进行操作。
#列表进行解包
>>>a = [1, 2, 3, 5, 6]
>>>b, c, d, f, g = a
>>>print(b, c, d, f, g)
1 2 3 5 6
#字典进行解包
>>>test_dicts = {'a': 'x', 'b': 1, 'c': 3}#以字典中第一个元素为例,'a'为“key”,'x'为“value”。
>>>q, w, e = test_dicts#字典默认是对“key”进行操作
>>>print(q, w, e)
a b c
>>>r, t, y = test_dicts.items()#用items()对“key”-“value”进行操作
print(r, y, t)
('a', 'x') ('c', 3) ('b', 1)
>>>i, o, p = test_dicts.values()#使用values()对“value”进行操作
print(i, o, p)
x 1 3
2. 用序列解包同时遍历多个序列(for x,y in zip(keys, values):)
>>>m=[[1,1],[4,5]]
>>>n=[[1,2],[2,3]]
>>>print(zip(m,n))
[([1, 1], [1, 2]), ([4, 5], [2, 3])]
>>>for a,b in zip(m,n):#a,b的实际形式为(a,b)故a,b的值为zip(m,n)中(,)内对应位置的值,如zip(m,n)的第一个元素为([1, 1], [1, 2]),则a的值对应为[1, 1],b的值对应为[1, 2]
print(a,b)
[1, 1] [1, 2]
[4, 5] [2, 3]
#a值 b值
3. zip(*)
该函数的运算顺序:先对 * 后面的序列进行解包,之后用zip()函数进行打包。
>>>nums = [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']]# 声明一个列表
>>>print(*nums)
['a1', 'a2', 'a3'] ['b1', 'b2', 'b3']
>>>iters = zip(*nums) # 参数为list数组时,是压缩数据,相当于zip()函数
>>>print("type of iters is %s" % type(iters))# 输出zip(*zipped)函数返回对象的类型
# 因为zip(*zipped)函数返回一个zip类型对象,所以我们需要对其进行转换
>>>print(dict(iters))# 在这里,我们将其转换为字典
type of iters is
>>>print(list(iters))# 在这里,我们将其转换为列表
[('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]
4. *zip()
该函数的运算顺序:zip()先对序列进行打包,然后 * 对打包好的序列进行解包。
# 创建2个列表
>>>m = [1, 2, 3]
>>>n = [4, 5, 6]
>>>print(zip(m, n))
[(1, 4), (2, 5), (3, 6)]
>>>print("*zip(m, n)返回:", *zip(m, n))
(1, 4), (2, 5), (3, 6)
>>>m2, n2 = zip(*zip(m, n))
>>>print("m2和n2的值分别为:", m2, n2)
m2和n2的值分别为:(1,2,3),(4,5,6)
# 若相等,返回True;说明*zip为zip的逆过程
>>>print(m == list(m2) and n == list(n2))
True
我也是小白,这是根据自己的理解一点一点码的,如果觉得有用,还请点个赞鼓励一下哦!如果有什么错误也欢迎留言交流哦!



