Python的zip函数

zip()函数:它是Python的内建函数,与序列有关的内建函数有:sorted()、reversed()、enumerate()、zip()

其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)


In [7]:
print(type(sorted([9, 19, 3, 6])))
print(type(reversed([9, 19, 3, 6])))
print(type(enumerate([9, 19, 3, 6])))
print(type(zip([9, 19, 3, 6], [6, 3, 9, 19])))


<class 'list'>
<class 'list_reverseiterator'>
<class 'enumerate'>
<class 'zip'>

定义:zip([seql, ...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的iterator(迭代器)。若传入参数的长度不等,则返回iterator的长度和参数中长度最短的对象相同。


In [13]:
z1 = [1, 2, 3, 4, 5]
z2 = [6, 7, 8, 9, 10]
result = zip(z1, z2)
print(result)
print(list(result))


<zip object at 0x000002C313B6C648>
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

In [30]:
z1 = [1, 2, 3, 4, 5]
z2 = [6, 7, 8]
result = zip(z1, z2)
print(result)
print(list(result))
x1, y1 = zip(*zip(z1, z2)) #如果此处直接传入result,则出错。未知原因。。。
print(list(x1))
print(list(y1))


<zip object at 0x000002C313C0F588>
[(1, 6), (2, 7), (3, 8)]
[1, 2, 3]
[6, 7, 8]

In [32]:
z1 = [1, 2, 3, 4]
z2 = ['a', 'b', 'c']
result = zip(z1, z2)
print(list(result))


[(1, 'a'), (2, 'b'), (3, 'c')]

In [35]:
z1 = [1, 2, 3, 4, 5]
z2 = [6, 7, 8, 9]
z3 = ['a', 'b', 'c', 'd']
result = zip(z1, z2, z3)
print(list(result))


[(1, 6, 'a'), (2, 7, 'b'), (3, 8, 'c'), (4, 9, 'd')]

In [47]:
x = [1, 2, 3]

y = [4, 5, 6]

z = [7, 8, 9]

xyz = zip(x, y, z)

u = zip(*xyz)

print(list(u))


[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
一般认为这是一个unzip的过程,它的运行机制是这样的: 在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9)) 所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)] 注:在函数调用中使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数(前提是对应函数支持不定个数的位置参数)

In [46]:
x1 = [1, 2, 3]
r = zip(* [x1] * 3)
print(list(r))


[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
它的运行机制是这样的: [x]生成一个列表的列表,它只有一个元素x [x] * 3生成一个列表的列表,它有3个元素,[x, x, x] zip(* [x] * 3)的意思就明确了,zip(x, x, x)