对于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-lookingfor循环来修补它,检查数组绑定的有效性,但它很快就变成了一个嵌套if语句的网络,我正在寻找一个更具python性质的解决方案。

最佳答案

使用简单的列表理解:

def f(seq, n):
    return [seq[max(i, 0):i + n] for i in range(-n + 1, len(seq))]

这将在给定序列上创建一个大小为n的滑动窗口,但在序列开始之前启动seqn - 1的目的是禁止负索引,以便每个切片都是非空的。
示例输出:
>>> f('ABCDEFG', 2)
['A', 'AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
>>> f('ABCDEFG', 3)
['A', 'AB', 'ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'FG', 'G']

10-06 08:52
查看更多