HOWTO · Python
Pythonでリストに関数を適用する方法
Pythonでリストに関数を適用できる主な方法は4つあります。forループ、map()関数、リスト内包表記、ジェネレータ式です。
このページの内容
Python リストの各要素に関数を適用するには、要素ごとに関数を呼び出し、返された値を集めます。たとえば、各数値に 10 を掛けると [1, 2, 3, 4] が [10, 20, 30, 40] に変換されます。for ループ、map()、リスト内包表記、ジェネレータ式を使うことができます。以下の例では、同じ関数と入力を使って、各方法がどのように結果を生成または提供するかを比較できるようにしています。
for ループを使って Python のリストに関数を適用する
for ループは各ステップを明示的にします。結果のリストを作成し、入力ごとに関数を呼び出し、返された値を追加していきます。これは、ループに追加の文や分岐が必要な場合に役立ちます。次の例では、各数値に関数を適用し、結果のリストを出力します。
def multiply_by_ten(number):
return 10 * number
numbers = [1, 2, 3, 4]
results = []
for number in numbers:
results.append(multiply_by_ten(number))
print(results)
このループは numbers を変更せず、results を別のリストとして構築します。自分のデータに必要な変換を行うように、関数本体を変更してください。
map() 関数を使って Python のリストに関数を適用する
Python の map() 関数 は、呼び出し可能オブジェクトと反復可能オブジェクトを受け取り、要素ごとに呼び出し可能オブジェクトの結果を生成します。Python 3 では、map() はイテレータを返します。残りのコードでリストが必要な場合は、それを list() でラップしてください。
def multiply_by_ten(number):
return 10 * number
numbers = [1, 2, 3, 4]
results = list(map(multiply_by_ten, numbers))
print(results)
この形式は、適用する関数がすでに用意できている場合に簡潔です。イテレータは list() が値を要求するにつれて消費されます。値を再度走査する必要がある場合は、結果のリストを保持するか、別のイテレータを作成してください。
リスト内包表記を使って Python のリストに関数を適用する
リスト内包表記 は、for 句の前に各要素の式を配置することで新しいリストを構築します。これは Python の言語構文であってメソッドではなく、変換が 1 行で明確に収まる場合にコンパクトな選択肢となります。
def multiply_by_ten(number):
return 10 * number
numbers = [1, 2, 3, 4]
results = [multiply_by_ten(number) for number in numbers]
print(results)
式 multiply_by_ten(number) が各結果を決定し、for 句が各入力要素を提供します。内包表記には、選択した要素だけを含めるための条件も追加できます。
ジェネレータ式を使って Python のリストに関数を適用する
ジェネレータ式 は、内包表記スタイルの式を丸括弧で囲んだものです。結果のリストを即座に構築するのではなく、要求されるにつれて値を遅延的に生成します。これにより、変換されたすべての値を一度に保持せずに済む場合がありますが、ジェネレータをリストに変換すると値は具現化されます。
def multiply_by_ten(number):
return 10 * number
numbers = [1, 2, 3, 4]
results = (multiply_by_ten(number) for number in numbers)
print(list(results))
各値は反復処理中に生成されます。ジェネレータは走査されるにつれて消費されるため、同じジェネレータに対する 2 回目の走査では値は繰り返されません。値を再利用する必要がある場合は、新しいジェネレータを作成するか、リストに格納してください。
まとめ
各ステップを明示的に制御したい場合は for ループを選び、既存の関数を反復可能オブジェクトに適用するのが自然な場合は map() を使ってください。リスト内包表記は簡潔な構文で新しいリストを直接作成します。遅延反復が望ましく、すべての結果を一度に具現化する必要がない場合はジェネレータ式を使ってください。4 つの方法はいずれも、自分で定義した関数だけでなく組み込み関数も呼び出すことができます。たとえば、内包表記では [str(item) for item in numbers] のように各要素に str を適用できます。