有两个有序序列,
a = [1, 4, 7, 10]
b = [2, 5, 6, 11]
要对其进行有序迭代,以前的思路大概是,取两个临时变量,分别代表序列的第一个值,然后挨个比较大小,如果被取出去,变量取值接着往后走,直到某个序列所有值被取出来。
在 Python 里有个 heapq.merge() 的函数,可以检查每个序列的第一个元素,比较大小,然后输出。
import heapq
a = [1, 4, 7, 10]
b = [2, 5, 6, 11]
for x in heapq.merge(a, b):
print(x)
1
2
4
5
6
7
10
11
当然,如果两个序列事先没有进行过排序,是得不到最后的有序结果的。
这里我们使用的是两个序列,那么多个序列进行比较呢?
通过尝试,是支持多个序列进行迭代的:
for x in heapq.merge(a, b, [5,9,20], [12,45]):
print(x)
补充
在 Python 的 IPython 里面,通过 tab 键,可以看到 heapq.merge() 这个函数官方例子,允许输入一个 key 的参数,key 值的选项可以是 len,也就是 元素的长度。
当我们将元素的长度作为参数的时候,是不会比较元素的首字母大小的,也就是说,仅仅是将长度作为参数来比较,而非其他。
例子如下:
list(heapq.merge(['rat','dog', 'tiger'], ['cat', 'eagle'], key = len))
Out[19]: ['rat', 'dog', 'cat', 'tiger', 'eagle']
在例子里,在第二次比较的时候,尽管 ‘dog’ 的 值要大于 ‘cat’,但因为长度都是3,所以先输出的是 ‘dog’。
还是以上的例子,如果不指定 key, 则会根据元素的大小进行比较,从首字母开始进行,例子如下:
list(heapq.merge(['rat','dog', 'tiger'], ['cat', 'eagle']))
Out[20]: ['cat', 'eagle', 'rat', 'dog', 'tiger']