Pythonでリストをn個のサブリストに分割する方法についてのメモです。 リストの長さがnで割り切れない場合でも、なるべく均等に分割されるように調整します。
Function Definition #
インデックス操作での方法 #
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
イテレータでの方法 #
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 を使ってイテレータを進めながらリストを分割する方法です。メモリの消費が少なく、大きなリストでも効率的に処理でします。
使い方 #
- インデックス操作版
split_list_into_n_chunks(list, number_of_splits)
- イテレータ版
split_list_into_n_chunks_iterator(list, number_of_splits)
実行例 #
例えば、以下のリストをsplit_list_into_n_chunks
で3分割します。
# 分割するリスト
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3
split_list_into_n_chunks(test_list, n)
出力:
[[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
また、split_list_into_n_chunks_iterator
は以下の通りとなります。
split_list_into_n_chunks_iterator(test_list, n)
出力:
[[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]