对于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解决方案.
使用简单的列表理解:
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)
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |