Python:强制heapq.merge在比较期间将字符串解释为整数

Python: Force heapq.merge to interpert strings as integers during comparison

我正在尝试合并一组预先排序的文件,其中每个文件中的每一行都是一个整数:

for line in heapq.merge(*files):

排序成功完成,但比较的是文件内容作为字符串,而不是整数。如何强制进行整数比较?

尝试读取文件并将每一行转换为整数。这假设所有数据都适合内存。

def read_as_int_list(file_name):
    with open(file_name) as fobj:
        return [int(line) for line in fobj]

这应该更有效地利用内存:

def read_as_ints(file_name):
    with open(file_name) as fobj:
        for line in fobj:
            yield int(line)

用法:

files = (read_as_ints(name) for name in list_of_file_names)
for line in heapq.merge(*files):
    print(line)

试试这个:

for line in heapq.merge(*(map(int, file) for file in files)):

这不会在比较期间将字符串解释为整数,但实际上是即时 将它们更改 为整数。因此,结果是整数,而不是字符串。如果需要,当然可以再转换回字符串:

for line in map(str, heapq.merge(*(map(int, file) for file in files))):

对于其他人/未来参考:这是针对 Python 3,其中 map returns 一个迭代器。在 Python 2 中,map 需要替换为 itertools.imap,以免在启动时将所有内容读入内存。