我正在尝试构建一个滑动窗口方法,它将滑动列表中元素的数字序列。这一点很重要,我相信,这与SO中的其他滑动窗口方法不同,在SO中,幻灯片通常是在列表的索引上制作的。你知道吗
我的意思是这样的。有整数列表的
li = [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
对于window=3
和step=2
,预期的输出将是:
[1, 3]
[3, 4, 5]
[5, 6, 7]
[7, 8, 9]
[9, 10, 11]
[11, 12]
到目前为止我掌握的代码是:
window = 3
step = 2
last_pos = 0
w_start = 1
w_end = window
next_start = w_start + step
dat = [] # values for window
next_dat = [] # values for the next window
li = [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
for e in li:
ipos = int(e)
if ipos > last_pos:
dat.append(ipos)
if ipos == w_end: # end of window
w_start += step
w_end += step
print(dat)
dat = next_dat # reset window...
if ipos >= next_start: # ipos is in the next window
next_dat.append(ipos)
if w_start == next_start: # move next window
next_start += step
next_dat = [] # reset next window...
else:
raise Exception('List is not sorted')
last_pos += 1
# the last window if not empty
print(dat) if dat else 'false'
输出是预期的:
[1, 3]
[3, 4, 5]
[5, 6, 7]
[7, 8, 9]
[9, 10, 11]
[11, 12]
然而,除了不太优雅之外,当两个以上的窗口重叠时,此代码似乎会失败。例如,使用window=5
和step=2
会产生错误的输出:
[1, 3, 4, 5]
[3, 4, 5, 6, 7]
[6, 7, 8, 9]
[8, 9, 10, 11]
[10, 11, 12]
第一个和第二个窗口还可以,但是从第三个开始,事情就变得一团糟了。例如,第三个窗口应该从5
开始,应该有5个元素,而不是4个。我的目标是获得以下窗口:
[1, 3, 4, 5]
[3, 4, 5, 6, 7]
[5, 6, 7, 8, 9]
[7, 8, 9, 10, 11]
[9, 10, 11, 12]
有什么办法可以纠正这种行为吗?你知道吗
请注意,要滑动的不是列表索引,而是列表值。我认为这两种方法在某些特定情况下是不同的,即列表中缺少一些值。在上面所示的情况下,列表中的前三项是1, 3, 4
。我认为迭代索引(window=2
和step=2
)将产生以下输出(但这没有经过测试):
[1, 3]
[4]
而我想做的是迭代列表的值,这样得到的窗口将是:
[1]
[3, 4]
因此值2
在第一个窗口中丢失,因为它不在原始列表中。你知道吗
虽然这是说明在这里与一个列表在最后,我会想读这些从一个巨大的文件,将很难进入内存。你知道吗
问题代码的问题在于,不确定需要预先跟踪多少个窗口。 此任务的最佳方法可能是只为窗口使用一个列表,然后复制与下一个窗口重叠的值,以此类推。你知道吗
下面的代码适用于我测试的所有窗口:
(窗口=3步=2)
(窗口=2步=2)
(窗口=5步=2)
同样,我认为这个代码不是很优雅,但它确实起到了作用,所以我将这个答案标记为已接受。但是,我仍然对这段代码的任何改进/建议持开放态度。你知道吗
相关问题 更多 >
编程相关推荐