Python リスト内の要素を指定した間隔「等差数列」でスライスする

 偶数番目の要素をスライスする場合は、list[::2]、奇数番目は、list[1::2]とします。Pythonの配列(リスト)は0番目から始まることに注意です。実施例を下図に示します。

f:id:HK29:20200621124044p:plain

 そして、list[::3]とすれば、下図のように2つ飛ばしの要素を抽出した新リストを作成できます。

f:id:HK29:20200621124403p:plain

 これを活用した例を次に示します。例えば、下図のように101枚の画像があるとします。

f:id:HK29:20200620121502j:plain

本コードを実行すると、下図のように5つ飛ばしで画像を残します。

f:id:HK29:20200620121546j:plain

これは、多数の画像ファイルから動画を作成する場合に有用です。画像枚数が多いと動画サイズも大きくなります。これを避けるために、画像ファイルを等間隔で間引けばファイルサイズ増大を抑制することができます。

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, glob
import re

def main():
    for myfolder in input_folder_list:
        # フォルダ内にある.jpgファイルをリストへ格納…リストA
        file_list = glob.glob(myfolder + '/*.jpg')
        # リスト内要素を並び替え
        file_list = sorted(file_list, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))

        # リスト内の要素を等差数列間隔でリスト化する…リストB
        leave_file_list = file_list[::step_n]
        print(leave_file_list)
        for file in file_list: # リストAをループして要素をひとつずつ取り出す
            if file not in leave_file_list: # リストB内の要素と合致しない場合の処理
                #print(file)
                os.remove(file) # ファイルを削除

if __name__ == '__main__':
    input_folder_list = ['dirJpg']
    step_n = 5

    main()

以上

<広告>