heapq.merge()函数列出已排序的文件

时间:2013-09-07 06:25:00

标签: python sorting python-2.7

我有一个已排序文件的列表,其中数据以'\ n'分隔。我想将它们合并在一起以获取单个已排序的文件。我不想一次性加载所有文件的内容。我正在使用 heapq库的合并功能

我写了以下代码

def merge(*flist):
    for element in heapq.merge(*flist):
        yield element

其中* flist是这样的元组 -

(<open file '/tmp/000000', mode 'w+b' at 0xb73eba70>,
<open file '/tmp/000001', mode 'w+b' at 0xb73ebac8>, 
<open file '/tmp/000002', mode 'w+b' at 0xb73ebb20>, 
<open file '/tmp/000003', mode 'w+b' at 0xb73ebb78>, 
<open file '/tmp/000004', mode 'w+b' at 0xb73ebc80>)

当我在循环中打印元素时,我得到的值是'2 \ n','44 \ n'。输出文件也不在排序顺序中。我认为问题是由于新的行字符。如何解决这个问题。

我试图在相当长的时间内解决这个问题,但无法解决它

1 个答案:

答案 0 :(得分:5)

将输入行转换为整数以获得数字排序而不是字符串排序:

def merge(*flist):
    return heapq.merge(*[itertools.imap(int, f) for f in flist])

请注意,迭代heapq.merge迭代器并产生每个元素是没有意义的。您只需返回迭代器并保存一个间接层即可。 (事实上​​,您的功能的原始版本可以替换为heapq.merge,而不会对呼叫站点进行任何更改。)