基本
コレクションやイテレーターの戻り値に何らかの処理を施したい場合、たとえば内包表記を使うことが課が得られる。
1 2 3 4 5 |
lst = [0, 1, 2, 3, 4] comprehension = [x * 2 for x in lst] print(comprehension) # 0, 2, 4, 6, 8] |
同様の効果があるmap()
関数は、コレクションやイテレーターの戻り値に関数を作用させた結果を返す。第1引数には適用したい関数、第2引数には適用対象となるコレクション等を指定する。
1 |
map([関数], [コレクション/リスト]) |
以下の例は、冒頭に示した内包表記と同じくリストの要素を2倍する。使い方としては、与えられた引数を2倍する関数を準備し、関数を第1引数に、対象となるリストを第2引数に与える。
1 2 3 4 5 6 7 |
def double(x): return x * 2 for x in map(double, lst): print(x, end=" ") print() # 0 2 4 6 8 |
なおmap
オブジェクトはイテレーターとして振舞うので、結果をリスト表示するためにはlist()
関数を通す必要がある。
1 2 3 4 5 |
print(map(double, lst)) # <map object at 0x03098290> print(list(map(double, lst))) # [0, 2, 4, 6, 8] |
再利用不可
map()
関数で得られたオブジェクトを変数にセットして使うこともできる。ただしmap
オブジェクトはイテレーターなので1度利用したものをそのまま再度利用することはできない。
1 2 3 4 5 6 7 8 9 10 |
mapped = map(double, lst) for x in mapped: print(x, end=" ") print() # 0 2 4 6 8 for x in mapped: print(x, end=" ") print() # nothing displayed |
イテレーター等の指定
また第2引数にはコレクションではなく、range
オブジェクトやイテレーターを渡すこともできる。
1 2 3 4 5 6 7 8 9 10 |
for x in map(double, range(5)): print(x, end=" ") print() # 0 2 4 6 8 from itertools import repeat for x in map(double, repeat(1, 5)): print(x, end=" ") print() # 2 2 2 2 2 |
ラムダ式が可能
map()
関数の第1引数には、関数のほかにラムダ式を指定することも可能。
1 2 3 4 5 |
for x in map(lambda x: x * 2, range(5)): print(x, end=" ") print() # 0 2 4 6 8 |
辞書によるマッピング
コードが格納されているコレクションから、辞書とmap()
関数でコードに対応する値を得ることができる。
1 2 3 4 5 6 |
dict = {0:"zero", 1:"one", 2:"two"} for x in map(lambda key: dict[key], [0, 1, 2, 1, 0]): print(x, end=" ") print() # zero one two one zero |
逆に値が格納されているコレクションから、辞書を使ってコードのコレクションを得ることもできる。この場合、辞書のキーとコードを入れ替えて適用する。
1 2 3 4 5 6 7 |
lst = ["two", "one", "zero", "one", "two"] dict_inv = {v:k for k, v in dict.items()} for x in map(lambda key: dict_inv[key], lst): print(x, end=" ") print() # 2 1 0 1 2 |