Python でリストをチャンクに分割する

Azaz Farooq 2023年1月30日
  1. Python でリストをリスト内包表記法を使ってチャンクに分割する
  2. Python で itertools メソッドを用いてリストをチャンクに分割する
  3. Python で lambda 関数を使ってリストをチャンクに分割する
  4. Python のリストを lambda & islice メソッドを使ってチャンクに分割する
  5. Python で NumPy メソッドを使ってリストをチャンクに分割する
  6. ユーザ定義関数を使って Python でリストをチャンクに分割する
Python でリストをチャンクに分割する

Python のデータ構造の中で、値や要素が混在しているものを含むことができるものの一つにリストと呼ばれるものがあります。この記事では、リストをチャンクに分割する様々な方法を紹介します。自分の仕様に合ったコード例であれば、どのようなものを使っても構いません。

Python でリストをリスト内包表記法を使ってチャンクに分割する

Python のリストをチャンクに分割するためにリスト内包表記を使うことができます。これは、コードを理解しやすくするために操作をカプセル化する効率的な方法です。

完全なサンプルコードを以下に示します。

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

n = 3

output = [test_list[i : i + n] for i in range(0, len(test_list), n)]
print(output)

出力:

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

range(0, len(test_list), n) は、0 から始まり len(test_list) で終わる数値の範囲を n のステップで返します。例えば、range(0, 10, 3)(0, 3, 6, 9) を返します。

test_list[i:i + n] はインデックス i から始まり i + n のみで終わるリストのチャンクを取得します。分割されたリストの最後のチャンクは test_list[9] ですが、計算されたインデックス test_list[9:12] はエラーにならずに test_list[9] と等しくなります。

Python で itertools メソッドを用いてリストをチャンクに分割する

このメソッドは、for ループを使って反復しなければならないジェネレータを提供します。ジェネレータはイテレータを記述する効率的な方法です。

from itertools import zip_longest

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


def group_elements(n, iterable, padvalue="x"):
    return zip_longest(*[iter(iterable)] * n, fillvalue=padvalue)


for output in group_elements(3, test_list):
    print(output)

出力:

('1', '2', '3')
('4', '5', '6')
('7', '8', '9')
('10', 'x', 'x')

[iter(iterable)]*n は 1つのイテレータを生成し、リストの中で n 回のイテレータ処理を行う。これは似たようなイテレータなので、そのような呼び出しはそれぞれ高度なものとなり、その結果、zip ラウンドロビンは n 個のオブジェクトからなる 1つのタプルを生成することになります。

Python で lambda 関数を使ってリストをチャンクに分割する

基本的な lambda 関数を用いてリストをあるサイズまたはそれより小さいチャンクに分割することができます。この関数は元のリストと N サイズの変数に対して働き、すべてのリスト項目を反復処理して N サイズのチャンクに分割します。

完全なサンプルコードを以下に示します。

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

x = 3


def final_list(test_list, x):
    return [test_list[i : i + x] for i in range(0, len(test_list), x)]


output = final_list(test_list, x)

print("The Final List is:", output)

出力:

The Final List is: [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10']]

Python のリストを lambda & islice メソッドを使ってチャンクに分割する

lambda 関数を islice 関数と組み合わせて利用することで、リストを反復処理するジェネレータを生成することができます。islice 関数は反復可能要素から選択された項目を抽出するイテレータを生成します。開始点が 0 以外の場合、開始点に到達する前に反復可能な要素はスキップされます。要素は、項目がスキップされるよりも高いステップが設定されていない限り、連続して返されます。

完全なコード例を以下に示します。

from itertools import islice

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


def group_elements(lst, chunk_size):
    lst = iter(lst)
    return iter(lambda: tuple(islice(lst, chunk_size)), ())


for new_list in group_elements(test_list, 3):
    print(new_list)

出力:

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

Python で NumPy メソッドを使ってリストをチャンクに分割する

ライブラリ NumPy を用いてリストを N サイズのチャンクに分割することもできます。関数 array_split() は配列を特定のサイズの n のサブ配列に分割します。

完全なサンプルコードを以下に示します。

import numpy

n = numpy.arange(11)

final_list = numpy.array_split(n, 4)
print("The Final List is:", final_list)

関数 arange は与えられた引数に応じて値を並べ替え、関数 array_split() はパラメータとして与えられたパラメータに基づいてリスト/サブ配列を生成します。

出力:

The Final List is: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]

ユーザ定義関数を使って Python でリストをチャンクに分割する

このメソッドはリストを繰り返し処理し、連続した n サイズのチャンクを生成します。この関数ではキーワード yield が用いられ、実行が中断されたときに値が回転したときに関数を停止して元に戻すことができます。ここが通常の関数との重要な違いです。通常の関数は元に戻ることができません。関数の中で yield 文を使う場合、関数はジェネレータと呼ばれます。ジェネレータは値を生成したり返したりするもので、単純な関数として名前を付けることはできず、イテレート可能なもの、つまりループを使うものとして名前を付けることができます。

完全なサンプルコードは以下の通りです。

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


def split_list(lst, n):
    for i in range(0, len(lst), n):
        yield lst[i : i + n]


n = 3

output = list(split_list(test_list, n))
print(output)

出力:

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

関連記事 - Python List