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
,以免在启动时将所有内容读入内存。
我正在尝试合并一组预先排序的文件,其中每个文件中的每一行都是一个整数:
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
,以免在启动时将所有内容读入内存。