从Python中按排序顺序排序的迭代器生成?

2024-09-30 04:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有更好的方法可以将一堆排序的迭代器合并/整理为一个迭代器,以便按排序顺序生成项?我认为下面的代码是可行的,但我觉得有一个更干净,更简洁的方法来做它,我错过了。在

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的解决方案,我还是有兴趣去看看。在


Tags: 方法keyinnoneforif排序item
1条回答
网友
1楼 · 发布于 2024-09-30 04:33:39

是的,您希望^{}只做一件事;按顺序迭代排序的迭代器

def sortkey(row):
    return (row[5], row)

def unwrap(key):
    sortkey, row = key
    return row

from itertools import imap
FILE_LIST = map(file, ['foo.csv', 'bar.csv'])
input_iters = imap(sortkey, map(csv.csvreader, FILE_LIST))
output_iter = imap(unwrap, heapq.merge(*input_iters))

相关问题 更多 >

    热门问题