许多编码挑战在同一行中有多个数字,通常第一行告诉多数字行中有多少个数字:
4
31 415 9 26
通常我只是读整行,然后.split()
并将字符串映射到数字。
但有没有好的办法not一次读取整行,而不是一次读取一个数字?为了节省内存,要么因为我can't或者不want将整行读入内存。我只想使用 O(1) 空间(假设数字很小/有界,所以它们的大小是 O(1) )。不必绝对最小,例如,如果解决方案在内部一次读取完整的 4 KB 内存页,那没关系,仍然是 O(1) 并且相对较小。对于用例,请考虑millions一行上的数字,以及内存限制(假设低于 1 MB)。
在 C++ 中我会这样做:
int n;
std::cin >> n;
while (n--) {
int value;
std::cin >> value;
// now do something with the value
}
我编写了这个生成器,它接受一个文件对象并为我提供一个字符串迭代器。对于上面的例子,它产生字符串'4'
, '31'
, '415'
, '9'
and '26'
。它一次读取一个字符,并按照以下方式按空格字符分割.isspace()
:
def split(file):
value = []
while char := file.read(1):
if char.isspace():
if value:
yield ''.join(value)
value.clear()
else:
value.append(char)
if value:
yield ''.join(value)
但这当然是极其复杂和缓慢的,我什至不知道这是否str.isspace
用法相当于什么str.split
考虑空白。它只是说明了实现我想要的目标的一种方法。
编辑:这是一个simpler方式,但仍然比我想要的更复杂和缓慢。我正在寻找一些内置的方法,以 C 速度为我完成低级工作。
from itertools import groupby
def split(file):
groups = groupby(iter(lambda: file.read(1), ''), str.isspace)
for isspace, chars in groups:
if not isspace:
yield ''.join(chars)