Python でリストをチャンクに分割する
- Python でリストをリスト内包表記法を使ってチャンクに分割する
-
Python で
itertools
メソッドを用いてリストをチャンクに分割する -
Python で
lambda
関数を使ってリストをチャンクに分割する -
Python のリストを
lambda
&islice
メソッドを使ってチャンクに分割する -
Python で
NumPy
メソッドを使ってリストをチャンクに分割する - ユーザ定義関数を使って 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']]