Есть ли лучший способ объединить / отсортировать несколько отсортированных итераторов в один, чтобы получить элементы в отсортированном порядке?Я думаю, что приведенный ниже код работает, но я чувствую, что есть более чистый, более краткий способ сделать это, которого мне не хватает.
def sortIters(*iterables, **kwargs):
key = kwargs.get('key', lambda x : x)
nextElems = {}
currentKey = None
for g in iterables:
try:
nextElems[g] = g.next()
k = key(nextElems[g])
if currentKey is None or k < currentKey:
currentKey = k
except StopIteration:
pass #iterator was empty
while nextElems:
minKey = None
stoppedIters = set()
for g, item in nextElems.iteritems():
k = key(item)
if k == currentKey:
yield item
try:
nextElems[g] = g.next()
except StopIteration:
stoppedIters.add(g)
minKey = k if minKey is None else min(k, minKey)
currentKey = minKey
for g in stoppedIters:
del nextElems[g]
Вариант использования для этого, что у меня есть куча файлов CSVчто мне нужно объединить согласно некоторому отсортированному полю.Они достаточно большие, поэтому я не хочу просто читать их все в списке и вызывать sort ().Я использую python2.6, но если есть решение для python3, мне все равно было бы интересно его увидеть.