2016-08-14 17 views
1

someListという短いリストがいくつか入っています。私がしたいことは、リストの3つの要素ごとに出力され、3番目のスライスの範囲ごとに反復されます。私はリスト内のn番目の範囲をforループとwhileループでスライスします

someList = [1,2,3,4,5,6,7,8,9,10] 

を持っているそうだとすれば、私のsomeListの出力は、ここで私は保存するための新しい一時リストを定義している私のコードでこの

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]] 

よう

する必要があります出力値

someList = [1,2,3,4,5,6,7,8,9,10] 
lookupRange = 3 
temp = [] 
for index,i in enumerate(someList): 
    while index <= len(someList): 
     temp.append(someList[index:index+lookupRange]) 
     index += 1    

print(temp) 
このコード私はいくつかのではなく、予期しない結果を得ることを実行しているときにしかし

...

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10], [10], [], [2, 3, 4, 5, 6, 7, 8, 9, 10], [3, 4, 5, 6, 7, 8, 9, 10], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [3, 4, 5, 6, 7, 8, 9, 10], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [7, 8, 9, 10], [8, 9, 10], [9, 10], [10], [], [8, 9, 10], [9, 10], [10], [], [9, 10], [10], [], [10], []] 

あなたが見ることができるように、最初の数行のために、私は確かに3のスライス範囲の期間とが、その後所望の出力を得るのですかそれはちょうど狂って行く...

ここで何がうまくいかないのアイデア?

PS:これを行うための簡単な方法(numpy.convolveなど)がありますが、特にforとwhileループで行う必要があります。

答えて

4

ループはネストされていますが、ループは1つのみ必要です。リスト内包使用

someList = [1,2,3,4,5,6,7,8,9,10] 
lookupRange = 3 
temp = [] 
for index in range(len(someList) - lookupRange + 1): 
    temp.append(someList[index:index+lookupRange]) 
1

>>> someList = [1,2,3,4,5,6,7,8,9,10] 
>>> chunk = 3 
>>> [someList[i : i + chunk] for i in range(len(someList) - chunk + 1)] 
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]] 
2

は、ここでは、純粋なPythonのワンライナーです。ナンシーは必要ありません。 Pythonの2で

someList = [1,2,3,4,5,6,7,8,9,10] 
lookupRange = 3 
temp = list(zip(*(someList[i:] for i in range(lookupRange)))) 
print(temp) 

出力

[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9), (8, 9, 10)] 

あなた本当にではなく、リストのリストのリストが必要な場合は、tempへの割り当ては

temp = zip(*(someList[i:] for i in range(lookupRange))) 

に単純化することができますタプルの数は、

に変更できますPythonの2または3

しかし、(あなたがそれらの内部リストを変異させる必要がある場合を除き)私はタプルに固執するだろうとして同様に動作0

temp = [list(u) for u in zip(*(someList[i:] for i in range(lookupRange)))] 

:タプルを使用していますタプルは少ないRAMを使用し、コードがあります同等のリストベースのコードよりも速いことがよくあります。


はここで伝統的なforループのカップルの代わりに、リスト内包内にネストされたジェネレータ式で行われている最後のバージョンです。

someList = [1,2,3,4,5,6,7,8,9,10] 
lookupRange = 3 

offset_lists = [] 
for i in range(lookupRange): 
    offset_lists.append(someList[i:]) 

temp = [] 
for u in zip(*offset_lists): 
    temp.append(list(u)) 
print(temp) 

出力

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]] 
関連する問題