使用^{} module跟踪要从中选取下一个排序值的列表:import heapq
def merge(*iterables):
h = []
for it in map(iter, iterables):
try:
next = it.next
h.append([next(), next])
except StopIteration:
pass
heapq.heapify(h)
while True:
try:
while True:
v, next = s = h[0]
yield v
s[0] = next()
heapq._siftup(h, 0)
except StopIteration:
heapq.heappop(h)
except IndexError:
return
这会将所有列表推送到一个堆中,并按其下一个值进行排序。每次生成最小值时,都会用所使用的iterable中的下一个值更新堆,并再次对堆重新排序。在
这本质上保留了一个[next_value, iterable]列表的列表,这些列表按next_value有效地排序。在
用法:
^{pr2}$
或者big_list = list(merge(*sorted_lists))
创建一个新的大列表,将所有值排序,高效。在
这个确切的实现作为^{} function添加到heapq模块中,因此您只需执行以下操作:from heapq import merge
big_list = list(merge(*sorted_lists))