Python
 Computer >> コンピューター >  >> プログラミング >> Python

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のバージョンに合わせて、最適な方法を選択してください。

  1. Pythonでリストのサイズ(要素数)を取得する方法|len関数の使い方を解説

    Pythonでリストのサイズ(要素数)を調べたいときは、組み込み関数 len() を使います。これは最もシンプルで標準的な方法です。len() 関数とはPython公式ドキュメントでは、len() について次のように説明されています。「len(arg) はオブジェクトの長さ(要素の数)を返します。引数には、文字列・bytes・タプル・リスト・range などのシーケンス、あるいは辞書・セット・frozenset などのコレクションを指定できます。」len() は組み込み関数であるため、追加のインポートは不要です。また、ユーザー定義クラスが特殊メソッド __len__ を実装していれば、そのクラ

  2. 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,