编辑:我以前的实现是双端队列解决方案(而不是完美的解决方案)。这是带有 2 个文件指针的解决方案:
def sliding_ranges(filename=r"C:\Temp\data.txt", N=10):
f1, f2 = open(filename), open(filename)
k, res, i1, i2, r1, r2 = 1, [], 0, 0, 1, 1
while True:
while r2 and (not i2 or i2 - i1 < N):
r2, k = f2.readline(), k + 1
if r2: i2 = int(r2)
while r1 and (not i1 or not r2 or i2 - i1 > N):
r1, k = f1.readline(), k - 1
if i1: res.append(k)
if r1: i1 = int(r1)
if not r1: break
return res
>>> sliding_ranges(r"C:\Temp\data.txt", 10)
[2, 1, 3, 2, 2, 2, 1]
上一个:这是一次通过的实现。当你遍历时,你一直在计算列表的长度
f = open(r"d:\temp\data.txt")
d, res, N = [], {}, 10
for j in f:
i = int(j)
if i not in res: res[i] = 1
for k, v in res.items():
if i - k > N:
d.append(v)
del res[k]
elif k != i:
res[k] += 1
d = d + [v for v in res.values()]
这是每次迭代中的对象列表
d []
res {}
d []
res {1: 1}
d []
res {1: 2, 4: 1}
d [2, 1]
res {34: 1}
d [2, 1]
res {34: 2, 37: 1}
d [2, 1]
res {34: 3, 42: 1, 37: 2}
d [2, 1, 3, 2]
res {42: 2, 48: 1}
d = [2, 1, 3, 2, 2, 2, 1]