zip将列表,元组或者其他序列的元素配对,新建一个元组构成的元素:
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
zipped = zip(seq1, seq2)
print(type(zipped))
list(zipped)
<class 'zip'>
[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
zip可以处理任意长度的序列,它生成的列表长度由最短的序列决定:
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
seq3 = [False, True]
list(zip(seq1, seq2, seq3))
[('foo', 'one', False), ('bar', 'two', True)]
zip的常用场景为同时遍历多个序列,有时会和enumerate同时使用:
for i in enumerate(zip(seq1, seq2)):
print(i)
(0, ('foo', 'one'))
(1, ('bar', 'two'))
(2, ('baz', 'three'))
for i, (a, b) in enumerate(zip(seq1, seq2)):
print(f"{i}: {a}, {b}")
0: foo, one
1: bar, two
2: baz, three
给一个已经配对的序列时,zip函数有一种机智的方式取拆分序列,这种方式的另一种思路是将行的列转化为列的列表:
pitchers = [('Nolan', 'Ryan'),
('Roger', 'Clemens'),
('Schilling', 'Curt')]
first_names, last_names = zip(*pitchers)
print(f"first_names:\n {first_names}\n")
print(f"last_names:\n {last_names}")
first_names:
('Nolan', 'Roger', 'Schilling')
last_names:
('Ryan', 'Clemens', 'Curt')