Python >> python チュートリアル >  >> Python Tag >> Windows

ペア、スライディング ウィンドウ、およびバッチで Python リストをループする方法は?

方法 1:連続する (スライドする) ウィンドウを繰り返す

以下が与えられます:

  • Python リスト lst
  • ウィンドウサイズ n

問題の定式化 :連続する要素ウィンドウでリストをループする方法 サイズ n の 、各反復で n にアクセスできるように リストの次の要素?

# INPUT: 
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
n = 3 # window

# OUTPUT: 
 Window:  ['a', 'b', 'c']
 Window:  ['b', 'c', 'd']
 Window:  ['c', 'd', 'e']
 Window:  ['d', 'e', 'f']
 Window:  ['e', 'f', 'g']

? 解決策 :Python リスト lst を反復するには サイズ n のウィンドウで 、すべてのリスト インデックスを反復する i 0 から n のインデックスまで - 最後のリスト要素 (含まれています)。ループ本体では、インデックスを使用して lst[i:i+n] をスライスしてウィンドウを取得します .スライスは元のリストのコピーを作成しないため、メモリ効率が高くなります。

完全なコードは次のとおりです:

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
n = 3

for i in range(len(lst)-n+1):
    batch = lst[i:i+n]
    print('Window: ', batch)

出力は次のとおりです:

'''
OUTPUT:
Window:  ['a', 'b', 'c']
Window:  ['b', 'c', 'd']
Window:  ['c', 'd', 'e']
Window:  ['d', 'e', 'f']
Window:  ['e', 'f', 'g']
'''

これの変形は、サイズ 2:ペアの連続するウィンドウを反復することです!

方法 2:ペアでリストを繰り返す

問題の定式化: 要素のペアでリストを反復処理する方法は?

これは、ウィンドウ サイズが n=2 である前の問題の変形です。 .同じアプローチを使用します:

? 解決策 :Python リスト lst を反復するには ペアで、すべてのリスト インデックスを反復します i 0 から最後から 2 番目のリスト要素 (含まれる) のインデックスまで。ループ本体では、インデックスを使用して lst[i:i+2] をスライスしてウィンドウを取得します .スライスは元のリストのコピーを作成しないため、メモリ効率が高くなります。

完全なコードは次のとおりです:

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

for i in range(len(lst)-1):
    pair = lst[i:i+2]
    print('Pair: ', pair)

出力は次のとおりです:

'''
OUTPUT:
Pair:  ['a', 'b']
Pair:  ['b', 'c']
Pair:  ['c', 'd']
Pair:  ['d', 'e']
Pair:  ['e', 'f']
Pair:  ['f', 'g']
'''

方法 3:重複しないウィンドウをスライスする (バッチ)

方法 1 で対処した一般的な問題の変形は、サイズ n のバッチでリストを反復処理することです。 .ただし、スライド ウィンドウはオーバーラップできません。

問題の定式化: サイズ n のバッチでリストを反復処理する方法 一方、各バッチには一意の要素 (重複しないバッチ) が必要ですか?

? 解決策 :range() を変更することでこれを行うことができます ループ変数 i を定義する関数 n のステップ サイズも含める .次に、スライス lst[i:i+n] を使用します n にアクセスするには 各インデックスの次の要素 i .これにより、リスト スライスのウィンドウ (バッチ) が重複しなくなります。

lst = ['a', 'b', 'c', 'd', 'e', 'f']
n = 3 # batch size

for i in range(0, len(lst)-n+1, n):
    batch = lst[i:i+n]
    print('Batch: ', batch)

出力は次のとおりです。

'''
OUTPUT:
Batch:  ['a', 'b', 'c']
Batch:  ['d', 'e', 'f']
'''

バックグラウンド スライス

? 背景 :スライスとは、特定の文字列から部分文字列を切り出す概念です。スライス表記 s[start:stop:step] を使用 すべての step にアクセスする インデックス start から始まる - 番目の要素 (含まれる) インデックス stop で終わる (除外)。 3 つの引数はすべてオプションなので、省略してデフォルト値 (start=0) を使用できます。 、 stop=len(lst)step=1 )。たとえば、式 s[2:4] 文字列 'hello' から スライス 'll' を切り出します および式 s[:3:2] スライス 'hl' を切り出します .