この記事では、Pythonでリストの全要素に関数などの処理を実行する方法を解説します。
リストの全要素に簡単な処理を実行したい場合、いちいちfor
文を使ってループ処理を記述するのはめんどくさいし効率が悪いです。
なので、Pythonに用意されている組み込み関数や内包表記を使って効率良く処理しましょう!!
ちなみに、リスト以外のイテラブルでも同様の処理が可能です。
リストの全要素に任意の関数を実行する
リストの全要素に任意の関数を実行した結果を受け取るにはmap()
関数を使います。
構文
map(function, iterable, ...)
引数
function | 関数を指定する |
---|---|
iterable | リストなどのイテラブルを指定する |
戻り値の型
<class 'map'>
解説
function
引数に指定した関数の引数としてiterable
引数の要素が1つずつ渡され、実行した結果をイテレーターとして返します。
iterable
引数は、複数指定できますが、第一引数で指定する関数はiterable
引数の数だけ引数を取る必要があります
また、内包表記
を使うことでも同様のことが実現可能です。内包表記については以下の記事を参考にしてください。
Link内包表記の種類と使い方を解説
それでは例としてリストの全要素に2倍にするだけの関数を実行してみます:
# 引数で受け取った値を2倍して返すだけの関数
def func(val):
return val * 2
l = [1, 2, 3]
l_mul = map(func, l)
print(l_mul)
実行結果
<map object at 0x10aac6ad0>
戻り値としてマップオブジェクト(イテレーター)が返されるのでprint()
関数で出力したい場合はリストなどに変換する。
l_mul = map(func, l)
print(list(l_mul))
実行結果
[2, 4, 6]
もちろん、function
引数にラムダ式も指定できます。
Linkラムダ式の使い方【匿名関数】
l = [1, 2, 3]
l_mul = map(lambda val: val * 2, l)
print(list(l_mul))
実行結果
[2, 4, 6]
イテラブルを複数指定する場合は、関数やラムダ式の引数に注意。
l1 = [1, 2, 3]
l2 = [4, 5, 6]
# イテラブルを2つ指定したので、引数を2つ取るラムダ式を定義
result = map(lambda val1, val2: val1 * val2, l1, l2)
print(list(result))
実行結果
[4, 10, 18]
同じ処理を内包表記を使って実装することができます。
def func(val):
return val * 2
l = [1, 2, 3]
l_mul = [func(val) for val in l]
print(l_mul)
実行結果
[2, 4, 6]
この程度の処理なら関数を使わなくても実装できます。
l = [1, 2, 3]
l_mul = [val * 2 for val in l]
print(l_mul)
実行結果
[2, 4, 6]
リスト内のTrueの要素のみを取得する
リスト内のTrue
の要素のみ取得するには、filter()
関数、または内包表記
を使う。
構文
filter(function, iterable)
引数
function | 関数やラムダを指定する |
---|---|
iterable | リストなどのイテラブルを指定する |
戻り値の型
<class 'filter'>
解説
function
引数に指定した関数の引数としてiterable
引数の要素が1つずつ渡され、処理された結果がTrue
の要素のみでイテレーターを構築して返します。
例としてリストの偶数の要素のみを取得してみます:
def func(val):
# 偶数ならTrueを返す
return val % 2 == 0
l = [1, 2, 3, 4]
even = filter(func, l)
print(even)
実行結果
<filter object at 0x10e702a70>
戻り値としてフィルターオブジェクト(イテレーター)が返されるのでprint()
関数で出力したい場合はリストなどに変換する。
even = filter(func, l)
print(list(even))
実行結果
[2, 4]
function
引数には、ラムダ式が指定できます。
l = [1, 2, 3, 4]
even = filter(lambda val: val % 2 == 0, l)
print(list(even))
実行結果
[2, 4]
同じ処理を内包表記を使って実装することができます。
l = [1, 2, 3, 4]
even = [val for val in l if val % 2 == 0]
print(even)
実行結果
[2, 4]
リストの全要素がTrueかどうか
リスト内の全ての要素がTrue
かどうかを確認するにはall()
関数を使います。
構文
all(iterable)
引数
iterable | リストなどのイテラブルを指定する |
---|
戻り値の型
<class 'bool'>
解説
iterable
引数に指定したイテラブルの全要素がTrue
ならTrue
を返し、1つでもFalse
ならFalse
を返します。
例としてリストに格納した要素がすべてTrue
かどうかを判定してみる:
# 格納されている要素がすべてTrueのリスト
l = [True, True]
print(all(l))
# 格納されている要素がすべてTrueではないリスト
l = [True, False]
print(all(l))
実行結果
True
False
リストが空の場合はTrue
を返します。
l = []
print(all(l))
実行結果
True
リストに1つでもTrueがあるかどうか
リスト内の要素に1つでもTrue
があるかどうかを確認するにはany()
関数を使う。
構文
any(iterable)
引数
iterable | リストなどのイテラブルを指定する |
---|
戻り値の型
コード
解説
iterable
引数に指定したイテラブルの要素に1つでもTrue
があればTrue
を返し、1つも無ければFalse
を返します。
例としてbool
値を格納したリストを用いて使い方を確認してみる:
l = [True, True]
print(any(l))
l = [True, False]
print(any(l))
l = [False, False]
print(any(l))
実行結果
True
True
False
リストが空の場合はFalse
を返します。
l = []
print(any(l))
実行結果
False
リストの全要素がFalseかどうか
any()
関数に否定であるnot
をつけることで全ての要素がFalse
の場合のみTrue
を返すようにできます。
l = [True, True]
print(not any(l))
l = [True, False]
print(not any(l))
l = [False, False]
print(not any(l))
実行結果
False
False
True
まとめ
この記事では、Pythonのリストもといイテラブルの全ての要素に処理を実行する方法を解説しました。
map
関数やfilter
関数などの高階関数を使うことで簡単に実装することができました。また、内包表記は高速かつ、お手軽なのでとても重宝します。
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ