PythonでリストをサイズNのチャンクに分割する方法
この記事では、ユーザーが入力したリストと指定されたチャンクサイズをもとに、リストをそのサイズごとに分割する方法を解説します。データをバッチ処理したり、ページネーションを実装したりする際によく使われるテクニックです。
方法1:yieldを使ったジェネレータ関数による分割
1つ目の方法は、yieldキーワードを使用するアプローチです。yieldを使うと関数はジェネレータ関数となり、呼び出されるたびに前回中断した箇所から処理を再開できます。これは、実行のたびに最初から処理を行う通常の関数との最大の違いです。メモリ効率が良いため、大きなリストを扱う場合にも適しています。
サンプルコード
def list_chunks(l, n):
"""リストlをサイズnのチャンクに分割するジェネレータ"""
for i in range(0, len(l), n):
yield l[i:i + n]
# ユーザー入力でリストを作成
A = list()
n = int(input("リストのサイズを入力してください: "))
print("数値を入力してください")
for i in range(n):
p = int(input("値="))
A.append(p)
print(A)
# チャンクサイズを指定して分割
chunk_size = int(input("チャンクサイズを入力してください: "))
my_list = list(list_chunks(A, chunk_size))
print("分割結果:", my_list)
実行結果
リストのサイズを入力してください: 6 数値を入力してください 値=12 [12] 値=33 [12, 33] 値=11 [12, 33, 11] 値=56 [12, 33, 11, 56] 値=44 [12, 33, 11, 56, 44] 値=89 [12, 33, 11, 56, 44, 89] チャンクサイズを入力してください: 3 分割結果: [[12, 33, 11], [56, 44, 89]]
方法2:リスト内包表記による一行での分割
2つ目の方法は、リスト内包表記を使うアプローチです。わずか一行のコードで同じ問題を解決できるのが魅力です。スライスの開始位置と終了位置を計算式で求めることで、各チャンクを切り出しています。
サンプルコード
# ユーザー入力でリストを作成
A = list()
n = int(input("リストのサイズを入力してください: "))
print("数値を入力してください")
for i in range(n):
p = int(input("値="))
A.append(p)
print(A)
# チャンクサイズを指定して分割(内包表記)
chunk_size = int(input("チャンクサイズを入力してください: "))
my_final = [A[i * chunk_size:(i + 1) * chunk_size] for i in range((len(A) + chunk_size - 1) // chunk_size)]
print("分割結果:", my_final)
実行結果
リストのサイズを入力してください: 6 数値を入力してください 値=23 [23] 値=34 [23, 34] 値=12 [23, 34, 12] 値=56 [23, 34, 12, 56] 値=33 [23, 34, 12, 56, 33] 値=22 [23, 34, 12, 56, 33, 22] チャンクサイズを入力してください: 3 分割結果: [[23, 34, 12], [56, 33, 22]]
補足:標準ライブラリや外部ライブラリを使う方法
Python 3.12以降では、標準ライブラリのitertools.batched()を使うことで、よりシンプルにチャンク分割が可能です。
from itertools import batched chunks = list(batched([12, 33, 11, 56, 44, 89], 3)) print(chunks) # [(12, 33, 11), (56, 44, 89)]
また、サードパーティライブラリのmore_itertoolsにあるchunked()関数も便利です。環境に応じて使い分けるとよいでしょう。
まとめ
yieldを使ったジェネレータ関数はメモリ効率が高く、大きなデータに向いています。- リスト内包表記なら一行で簡潔に書けます。
- Python 3.12以降なら
itertools.batched()が最も手軽です。
用途やPythonのバージョンに合わせて、最適な方法を選択してください。
-
Pythonでリストのサイズ(要素数)を取得する方法|len関数の使い方を解説
Pythonでリストのサイズ(要素数)を調べたいときは、組み込み関数 len() を使います。これは最もシンプルで標準的な方法です。len() 関数とはPython公式ドキュメントでは、len() について次のように説明されています。「len(arg) はオブジェクトの長さ(要素の数)を返します。引数には、文字列・bytes・タプル・リスト・range などのシーケンス、あるいは辞書・セット・frozenset などのコレクションを指定できます。」len() は組み込み関数であるため、追加のインポートは不要です。また、ユーザー定義クラスが特殊メソッド __len__ を実装していれば、そのクラ
-
Pythonでリストを均等なサイズのチャンクに分割する方法
スライス演算子を使った基本的な方法 リストを均等なサイズのチャンクに分割する最も簡単な方法は、スライス演算子を繰り返し使用し、開始位置と終了位置を固定数ずつずらしていくことです。 次の例では、12個の要素を持つリストを、長さ4の3つのリストに分割しています。 l = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120] x = 0 y = 12 for i in range(x, y, 4): x = i print(l[x:x+4]) 実行結果: [10, 20, 30, 40] [50, 60, 70, 80] [90,