より良い名前がないので、Pythonで「izip_sorted」を実行したいと思います。関数への入力は、それぞれがソートされた多数の反復可能オブジェクトです。出力は、ソートされた出力を持つ単一の反復可能です。
print([x for x in izip_sorted([0,4,8], [1,3,5], [12,12,42],[])])
編集:これは簡単な例です。実際の使用法は、それぞれ約100000個の要素を持つ約40個の入力反復可能オブジェクトです。__cmp__
各要素は、要素を並べ替えることができるようにdictと実装を格納するクラスです。データが大きすぎて一度に読み込むことができません。
印刷する必要があります
[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:]