【问题标题】:heapq.merge() function to list of sorted filesheapq.merge() 函数来列出已排序的文件
【发布时间】:2013-09-07 14:36:43
【问题描述】:

我有一个排序文件列表,其中数据由 '\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'。输出文件也不按排序顺序。我认为问题是由于换行符造成的。如何解决这个问题。

我试图解决这个问题已经很久了,但无法解决它

【问题讨论】:

  • 输入文件中的数据是否按数字排序?
  • 您希望按 ascii 字典顺序还是数字顺序进行排序?您可能需要将输入元素转换为整数。
  • 请发布一些示例数据和预期输出。
  • @1_CR 是的,tmp 中的所有文件都按数字排序
  • 对于字符串:'100' &gt; '2'False,首先将它们转换为整数。

标签: python sorting python-2.7


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多