给定两个整数 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)中的索引
为了澄清,考虑两个字符串,一个长度为 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)中的索引