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

Inspired by the itertools pairwise recipe

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)

Description: Three iterators are teed and enumerated 0, 1, 2. These serve as columns in the output that are advanced i times, which effectively moves the columns "up" by i. The columns are zipped as rows up to the length of the shortest iterable (the last column which terminates at 7).

于 2013-07-16T23:39:59.463 に答える