python - 在 Python 中按排序顺序从排序的迭代器中产生?

标签 python sorting iterator

有没有更好的方法将一堆排序的迭代器合并/整理成一个,以便它按排序顺序生成项目?我认为下面的代码有效,但我觉得我缺少一种更简洁、更简洁的方法。

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 的解决方案,我仍然有兴趣看到它。

最佳答案

是的,你想要heapq.merge()它只做一件事;按顺序迭代排序的迭代器

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))

关于python - 在 Python 中按排序顺序从排序的迭代器中产生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928421/

相关文章:

java - Hadoop Map Reduce - 如何将分组与排序分开?

c++ - 从 back_insert_iterator 中提取容器的 value_type 的特征类

Java:难道不能使用迭代器来迭代对象的HashMap并改变对象的属性吗?

python - 当它的键未知时从字典中删除一个项目

python - TensorFlow 1.5.0-rc0 : error using `tf.app.flags`

python - 按对元素的频率对列表对进行排序

java - 基于 3 列对多维数组进行排序

javascript - 使用下划线 groupby 按颜色对一系列汽车进行分组

python - 解析关键字并在数组中查找相关行

python - 如何使用 python 中的地面控制点对未引用的航拍图像进行地理配准