4

リストのインデックスを利用してそれを行うことができます...

lst =[1,2,3,4,5,6]
[ [lst[i] , lst[i+1]] for i in range( len(lst) - 1 )]

また:

lst =[1,2,3,4,5,6]
for i in range(len(lst)-1): 
    entities.append([lst[i],lst[i+1]])

しかし、よりスマートな方法はありますか?たぶんイテレータを使用していますか?パフォーマンスはどうですか?

4

5 に答える 5

4

ここでいくつかの巧妙な回答を受け取りましたが、これを行う最も明白な方法は、組み込みのスライス インデックスを使用することです。そのようです:

def gen_k_slices(seq, k):
    for i in range(len(seq) - k + 1):
        yield seq[i:i+k]

ここに小さなテストドライバーがあります:

TEST = [1, 2, 3, 4, 5, 6]
for k in range(8):
    print("k={} -> {}".format(k, list(gen_k_slices(TEST, k))))

およびその出力:

k=0 -> [[], [], [], [], [], [], []]
k=1 -> [[1], [2], [3], [4], [5], [6]]
k=2 -> [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
k=3 -> [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
k=4 -> [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
k=5 -> [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]
k=6 -> [[1, 2, 3, 4, 5, 6]]
k=7 -> []

k=0 の結果も気に入らない ;-)

于 2013-09-15T23:10:13.030 に答える
2

使用できますzip()

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

>>> list(zip(lst[:-1],lst[1:]))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

>>> list(zip(lst[:-2],lst[1:-1],lst[2:]))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
于 2013-09-15T21:46:54.140 に答える
1

イテレータはこのようになります。

def iterate_couples(lst):
    for i in range(len(lst) - 1): 
        yield [lst[i], lst[i + 1]]
于 2013-09-15T21:45:21.143 に答える