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
,b
和c
?我已经看过,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,不会同时将数据全部拉入内存,并假设每个输入流已经排序(从最小到最大).