流畅的python和cookbook学习笔记(六)

时间:2023-02-04 16:04:37

1.同时迭代多个序列(zip(函数))

  使用zip()函数可以同时迭代多个序列。

>>> X = [1, 2, 3, 4, 5, 6]
>>> Y = [121, 223, 116, 666, 919, 2333]
>>> for x, y in zip(X, Y):
...
print(x, y)
...
1 121
2 223
3 116
4 666
5 919
6 2333

  zip(a, b)的作用是创建一个迭代器,产生元组(x, y),x取自a序列,y取自b序列,当a,b序列中其中一个没有元素可以继续迭代时,整个迭代过程结束。

>>> a = [1, 2, 3, 4, 5, 6]
>>> b = ['x', 'y', 'z']
>>> for x, y in zip(a, b):
...
print(x, y)
...
1 x
2 y
3 z
>>>

  如果想对多余的序列进行迭代,即上面a中的4,5,6元素,可以使用 itertools.zip_longest() 。

>>> a = [1, 2, 3, 4, 5, 6]
>>> b = ['x', 'y', 'z']
>>> from itertools import zip_longest
>>> for i in zip_longest(a, b):
...
print(i)
...
(
1, 'x')
(
2, 'y')
(
3, 'z')
(
4, None) # 多余元素对应None
(5, None)
(
6, None)
>>> for i in zip_longest(a, b, fillvalue=2): # 可以指定多余元素对应的值
... print(i)
...
(
1, 'x')
(
2, 'y')
(
3, 'z')
(
4, 2) # 指定多余元素对应值为2
(5, 2)
(
6, 2)

   zip()函数也可以接受多余2个的序列,和2个序列的使用情况一样。

 

2.在不同的容器中进行迭代

  使用itertools.chain()方法可以用来迭代不同容器中的对象。chain比先合并 a,b 序列再迭代更高效,更优雅,更pythonic。

>>> from itertools import chain
>>> a = [1, 2, 3, 4, 5]
>>> b = ['x', 'y', 'z']
>>> for i in chain(a, b):
...
print(i)
...
1
2
3
4
5
x
y
z

 

3.合并多个有序序列,并对整个有序序列进行迭代

  合并多个有序序列,在对整个有序序列进行迭代,可以使用模块heapq,使用heapq.merge()函数。注意序列必须是有序的。

>>> from heapq import merge
>>> a = [1, 3, 4, 5, 7, 9]
>>> b = [2, 6, 8, 11, 13]
>>> for i in merge(a, b):
...
print(i)
...
1
2
3
4
5
6
7
8
9
11
13