Python Cookbook 4.15 对多个有序序列进行迭代

有两个有序序列,

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']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值