给定两个整数 m 和 n,其中 m >= n,你如何创建一个生成器来 return 所有滑动 windows?

Given two integers m and n, where m >= n, how can you create a generator to return all the sliding windows?

为了澄清,考虑两个字符串,一个长度为 m,另一个长度为 n。

例如 m = 3 和 n = 2,其中 s1 = abc 和 s2 = de。

首先我们比较一下:

 abc 
de
and generate tuple (0, 1) (as a and e are being compared, so give their indices)
then slide string s2

 abc 
 de
generate (0, 0) {compare a and d} 
generate (1, 1) {compare b and e}
 slide string s2

 abc 
  de
generate (1, 0) {compare b and d} 
generate (2, 1) {compare c and e}
 slide string s2

 abc 
   de
generate (2, 0) {compare c and d} 

所以我们 return 生成 (0, 1), (0, 0), (1, 1), (1, 0), (2, 1), (2, 0)订单

如果例如 m = 2 并且 n = 2

我们将使用滑动较小字符串的相同方法生成 (0, 1), (0, 0), (1, 1), (1, 0)。

out = (
    (i1, i2)
    for anchor in range(n-1, -m, -1)
    for i1, i2 in enumerate(range(anchor, n))
    if 0 <= i1 < m and 0 <= i2 < n
)

测试

for m, n in [(3, 2), (2, 2), (5, 3)]:
    out = (
        (i1, i2)
        for anchor in range(n-1, -m, -1)
        for i1, i2 in enumerate(range(anchor, n))
        if 0 <= i1 < m and 0 <= i2 < n
    )
    print(*out, '', sep='\n')

输出

(0, 1)
(0, 0)
(1, 1)
(1, 0)
(2, 1)
(2, 0)

(0, 1)
(0, 0)
(1, 1)
(1, 0)

(0, 2)
(0, 1)
(1, 2)
(0, 0)
(1, 1)
(2, 2)
(1, 0)
(2, 1)
(3, 2)
(2, 0)
(3, 1)
(4, 2)
(3, 0)
(4, 1)
(4, 0)

你可以这样做:

m = 3
n = 2

gen = ((j+i, j) 
       for i in range(1-n, m)
       for j in range(max((0, -i)), min((n, m-i))))

for t in gen:
    print(t)

给予:

(0, 1)
(0, 0)
(1, 1)
(1, 0)
(2, 1)
(2, 0)

这里:

  • i 是两个字符串的第一个字符之间的偏移量(在您的示例中按该顺序从 -1 到 2)
  • j是第二个字符串(s2)中的索引