2

我有一个关于 python 和列表的非常简单的问题。

我需要循环遍历一个列表并获取固定长度的子列表,从头到尾。为了更清楚:

    def get_sublists( length ):
            # sublist routine

    list = [ 1, 2, 3, 4, 5, 6, 7 ]

    sublist_len = 3

    print get_sublists( sublist_len )

这应该返回如下内容:

    [ 1, 2, 3 ]
    [ 2, 3, 4 ]
    [ 3, 4, 5 ]
    [ 4, 5, 6 ]
    [ 5, 6, 7 ]

在python中有没有简单而优雅的方法来做到这一点?

4

4 回答 4

6

使用循环并产生切片:

def get_sublists(length):
    for i in range(len(lst) - length + 1)
        yield lst[i:i + length]

或者,如果您必须返回一个列表:

def get_sublists(length):
    return [lst[i:i + length] for i in range(len(lst) - length + 1)]
于 2013-07-16T23:21:56.817 回答
3
[alist[i:i+3] for i in range(len(alist)-2)]
于 2013-07-16T23:22:37.287 回答
2

itertools 成对配方的启发

from itertools import izip, tee
def nwise(iterable, n):
    z = tee(iterable, n)
    for i, x in enumerate(z):
            for k in range(i):
                    next(x)
    return izip(*z)

for l in nwise(iter([ 1, 2, 3, 4, 5, 6, 7 ]), 3):
    print l

# Output
(1, 2, 3)
(2, 3, 4)
(3, 4, 5)
(4, 5, 6)
(5, 6, 7)

描述: 三个迭代器被 teed 和枚举01, 2. 这些用作输出中的列,它们是高级i时间,这有效地将列“向上”移动i. 这些列被压缩为行,直到最短迭代的长度(最后一列终止于7)。

于 2013-07-16T23:39:59.463 回答
0

考虑more_itertools.windowed

import more_itertools as mit

lst = [ 1, 2, 3, 4, 5, 6, 7 ]

list(mit.windowed(lst, 3))
# [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]

具体实现见源码

于 2016-12-03T17:36:18.743 回答