如何将Python列表转换为包括边项的连续元组?

use*_*828 2 python python-3.x

对于Python列表:

l = list('ABCDEFG')
Run Code Online (Sandbox Code Playgroud)

怎么能把它变成一个连续的N元组列表,边缘情况不被抛出?这是N = 3的示例:

A
A B
A B C
B C D
C D E
D E F
E F G
F G
G
Run Code Online (Sandbox Code Playgroud)

我可以接近

for first, second, third in zip(l,l[1:],l[2:]):
    print(first, second, third)
Run Code Online (Sandbox Code Playgroud)

但是,这并不包括在边缘的情况下,不能容易地扩展到其他Ñ.我可以使用C-looking for循环来修补它,检查数组绑定的有效性,但它很快就会变成一个嵌套if语句的网络,我正在寻找更多的Pythonic解决方案.

vau*_*tah 7

使用简单的列表理解:

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

这将创建一个大小n超过给定序列的滑动窗口seq,但n - 1在序列开始之前开始.目的max(i, 0)是禁止负索引,以便每个切片都是非空的.

示例输出:

>>> f('ABCDEFG', 2)
['A', 'AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
>>> f('ABCDEFG', 3)
['A', 'AB', 'ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'FG', 'G']
Run Code Online (Sandbox Code Playgroud)