Pythonのmap()関数
Pythonのmap()関数は、指定したイテラブルのすべての要素に関数を適用し、マップオブジェクトを返します。Pythonのマップオブジェクトはイテレータですので、その要素を反復処理することができます。また、それらのファクトリ関数を使用して、マップオブジェクトをリスト、タプルなどのシーケンスオブジェクトに変換することもできます。
Pythonのmap()関数
Pythonのmap()関数の構文は次のようになります。
map(function, iterable, ...)
map()関数には複数の反復可能な引数を渡すことができますが、その場合、指定した関数はその引数の数と同じ数を持つ必要があります。この関数は、これらの反復可能な要素に対して並列で適用されます。複数の反復可能な引数を持つ場合、最も短い反復可能な要素が使い果たされると、マップイテレーターは停止します。
Pythonのmap()の例
map()関数と一緒に使用する機能を書きましょう。
def to_upper_case(s):
return str(s).upper()
入力オブジェクトの文字列表現の大文字を返すシンプルな機能です。イテレータの要素をプリントするためのユーティリティ関数も定義しています。この関数は、すべてのコード断片で再利用され、イテレータの要素をスペース区切りで表示します。
def print_iterator(it):
for x in it:
print(x, end=' ')
print('') # for new line
異なる種類のイテラブルを使用したmap()関数の例を見てみましょう。
Pythonのmap()関数を使った文字列の処理
# map() with string
map_iterator = map(to_upper_case, 'abc')
print(type(map_iterator))
print_iterator(map_iterator)
出力:
<class 'map'>
A B C
Pythonのmap()関数をタプルと一緒に使う。
# map() with tuple
map_iterator = map(to_upper_case, (1, 'a', 'abc'))
print_iterator(map_iterator)
出力:
1 A ABC
リストを使用したPythonのmap()
map_iterator = map(to_upper_case, ['x', 'a', 'abc'])
print_iterator(map_iterator)
出力:
X A ABC
マップをリスト、タプル、セットに変換する
マップオブジェクトはイテレーターなので、リスト、タプル、セットなどを作成するためのファクトリーメソッドに引数として渡すことができます。
map_iterator = map(to_upper_case, ['a', 'b', 'c'])
my_list = list(map_iterator)
print(my_list)
map_iterator = map(to_upper_case, ['a', 'b', 'c'])
my_set = set(map_iterator)
print(my_set)
map_iterator = map(to_upper_case, ['a', 'b', 'c'])
my_tuple = tuple(map_iterator)
print(my_tuple)
結果、日本語のネイティブなパラフレーズの提供をします。
['A', 'B', 'C']
{'C', 'B', 'A'}
('A', 'B', 'C')
Pythonのmap()関数を使用して、ラムダ関数で表現する。
もし再利用する必要がない場合は、map()と一緒にラムダ関数を使用することができます。この方法は、関数が小さくて新しい関数を定義したくない場合に便利です。
list_numbers = [1, 2, 3, 4]
map_iterator = map(lambda x: x * 2, list_numbers)
print_iterator(map_iterator)
出力:
2 4 6 8
Pythonのmap()関数に複数の引数を与える方法。
複数のイテラブル引数を使用したmap()関数の例を見てみましょう。
# map() with multiple iterable arguments
list_numbers = [1, 2, 3, 4]
tuple_numbers = (5, 6, 7, 8)
map_iterator = map(lambda x, y: x * y, list_numbers, tuple_numbers)
print_iterator(map_iterator)
出力:5 12 21 32。この関数は2つの引数を持っていることに注意してください。出力のマップイテレータは、この関数を並列に2つのイテラブル要素に適用した結果です。異なるサイズのイテラブルの場合、どうなるか見てみましょう。
# map() with multiple iterable arguments of different sizes
list_numbers = [1, 2, 3, 4]
tuple_numbers = (5, 6, 7, 8, 9, 10)
map_iterator = map(lambda x, y: x * y, list_numbers, tuple_numbers)
print_iterator(map_iterator)
map_iterator = map(lambda x, y: x * y, tuple_numbers, list_numbers)
print_iterator(map_iterator)
出力:
5 12 21 32
5 12 21 32
引数が異なるサイズを持つ場合、要素が使い果たされるまで、map関数が適用されます。
Pythonのmap()関数をNone引数で使用した場合は、以下のようになります。
関数をNoneとして渡した場合、何が起こるか見てみましょう。
map_iterator = map(None, 'abc')
print(map_iterator)
for x in map_iterator:
print(x)
結果を日本語で自然な言い回しで言い換えてください。一つのオプションだけで結構です。
結果:
Traceback (most recent call last):
File "/Users/scdev/Documents/github/scdev/Python-3/basic_examples/python_map_example.py", line 3, in <module>
for x in map_iterator:
TypeError: 'NoneType' object is not callable
弊社のGitHubリポジトリから、完全なPythonスクリプトや他のPythonの例をチェックアウトすることができます。
参照:公式ドキュメント