由于没有更好的名字,我想在 Python 中做一个“izip_sorted”。该函数的输入是许多迭代,每个迭代。输出是具有排序输出的单个迭代。
print([x for x in izip_sorted([0,4,8], [1,3,5], [12,12,42],[])])
编辑:这是一个简单的例子。真正的用途将是大约 40 个输入迭代,每个迭代大约有 100000 个元素。每个元素都是一个类,存储一个字典和实现__cmp__
,以便可以对元素进行排序。数据太大,无法一次全部读取。
应该打印
[0, 1, 3, 4, 5, 8, 12, 12, 42]
我有一个解决方案,但我是 python 新手,我不知道它非常Pythonic。这可以改进吗?只有 1 个元素发生变化的那种似乎很浪费......
def izip_sorted(*iterables):
"""
Return an iterator that outputs the values from the iterables, in sort order
izip_sort('ABF', 'D', 'CE') --> A B C D E F
"""
iterators = [iter(it) for it in iterables]
current_iterators = []
for it in iterators:
try:
current_iterators.append((next(it), it))
except StopIteration:
pass
current_iterators.sort(key=lambda x: x[0])
while(current_iterators):
yield current_iterators[0][0]
try:
current_iterators[0] = (next(current_iterators[0][1]), current_iterators[0][1])
current_iterators.sort(key=lambda x: x[0])
except StopIteration:
current_iterators = current_iterators[1:]