按顺序迭代多个排序列表

wfh*_*wfh 6 python iterator list

假设我有许多对(int,str)列表,不一定长度相同.这里唯一的限制是列表按整数部分按升序排序:

a = [(1, 'a'), (4, 'a'), (6, 'b'), (7, 'c'), (12, 'a')]
b = [(5, 'd'), (10, 'c'), (11,'e')]
c = [(0, 'b'), (3, 'd')]
Run Code Online (Sandbox Code Playgroud)

我想要做的是按照相应的整数元素出现的顺序发出字符串元素,即在这种情况下:

(0, 'b'), (1, 'a'), (3, 'd'), (4, 'a'), ... 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有明显的(漂亮+ Python化)的方式来做到这一点只用迭代器a,bc?我已经看过,itertools但在这种情况下无法立即看到如何使用该功能.这些名单a,b,c可能是非常大的,所以我想这样做不读他们入内存,然后排序...

iCo*_*dez 14

由于列表已经排序,您可以使用heapq.merge:

>>> import heapq
>>> a = [(1, 'a'), (4, 'a'), (6, 'b'), (7, 'c'), (12, 'a')]
>>> b = [(5, 'd'), (10, 'c'), (11,'e')]
>>> c = [(0, 'b'), (3, 'd')]
>>> for i in heapq.merge(a, b, c):
...     i
...
(0, 'b')
(1, 'a')
(3, 'd')
(4, 'a')
(5, 'd')
(6, 'b')
(7, 'c')
(10, 'c')
(11, 'e')
(12, 'a')
>>>
Run Code Online (Sandbox Code Playgroud)

这对于大型列表也非常有效,因为它在内部使用迭代器.从上面给出的文档链接:

类似sorted(itertools.chain(*iterables))但返回一个iterable,不会同时将数据全部拉入内存,并假设每个输入流已经排序(从最小到最大).