メインコンテンツへスキップ

Pythonでリストをn分割する方法

··1 分·
List Python
Makoto Morinaga
著者
Makoto Morinaga
技術メモ、コーディング、環境構築のための個人ノート。
目次

Pythonでリストをn個のサブリストに分割する方法についてのメモです。 リストの長さがnで割り切れない場合でも、なるべく均等に分割されるように調整します。

Function Definition
#

インデックス操作での方法
#

python
def split_list_into_n_chunks(original_list: list, split_num: int) -> list:
    chunk_size, remainder = divmod(len(original_list), split_num)

    chunks = []
    start = 0
    for _ in range(split_num):
        end = start + chunk_size + (1 if remainder > 0 else 0)
        chunks.append(original_list[start:end])
        start = end
        remainder -= 1
    return chunks

イテレータでの方法
#

python
from itertools import islice

def split_list_into_n_chunks_iterator(original_list: list, split_num: int) -> list:
    it = iter(original_list)
    return [list(islice(it, chunk_size)) for chunk_size in distribute(len(original_list), split_num)]

def distribute(total_length, num_chunks):
    base_chunk_size, extra = divmod(total_length, num_chunks)
    return [base_chunk_size + 1 if i < extra else base_chunk_size for i in range(num_chunks)]

2つの関数の違い
#

  • インデックス操作版

    start と end のインデックスを計算しながら、リストをスライスして分割します。 実装が簡単で、リスト全体を一度に処理します。

  • イテレータ版

    islice を使ってイテレータを進めながらリストを分割する方法です。メモリの消費が少なく、大きなリストでも効率的に処理でします。

使い方
#

  • インデックス操作版
python
split_list_into_n_chunks(list, number_of_splits)
  • イテレータ版
python
split_list_into_n_chunks_iterator(list, number_of_splits)

実行例
#

例えば、以下のリストをsplit_list_into_n_chunksで3分割します。

python
# 分割するリスト
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3

split_list_into_n_chunks(test_list, n)

出力:

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

また、split_list_into_n_chunks_iteratorは以下の通りとなります。

python
split_list_into_n_chunks_iterator(test_list, n)

出力:

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

関連記事

Pythonで混同行列と分類レポートの生成
··1 分
Python Metric Classification Confusion-Matrix
EmacsからRuffを使う
··2 分
Python Ruff Emacs
Pythonでのjsonlの扱い方法
··1 分
Python Jsonl