параметр
ли лучший способ объединить / отсортировать несколько отсортированных итераторов в один, чтобы получить элементы в отсортированном порядке? Я думаю, что код ниже работает, но я чувствую, что есть более чистый, более краткий способ сделать это, что я пропускаю.
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, мне все равно было бы интересно его увидеть.