对于Python列表:
l = list('ABCDEFG')
如何将其转换为连续N元组的列表,而不抛出边案例?下面是N=3的一个例子:
A
A B
A B C
B C D
C D E
D E F
E F G
F G
G
我可以接近
for first, second, third in zip(l,l[1:],l[2:]):
print(first, second, third)
但这不包括边的情况,也不容易扩展到其他N。我可以用一个C-looking
for
循环来修补它,检查数组绑定的有效性,但它很快就变成了一个嵌套if
语句的网络,我正在寻找一个更具python性质的解决方案。 最佳答案
使用简单的列表理解:
def f(seq, n):
return [seq[max(i, 0):i + n] for i in range(-n + 1, len(seq))]
这将在给定序列上创建一个大小为
n
的滑动窗口,但在序列开始之前启动seq
。n - 1
的目的是禁止负索引,以便每个切片都是非空的。示例输出:
>>> f('ABCDEFG', 2)
['A', 'AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
>>> f('ABCDEFG', 3)
['A', 'AB', 'ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'FG', 'G']