map
このページでは豊富な例を用いてPythonの組み込み関数であるmap関数の使い方を学ぶことができます。
mapは組み込み関数の1つで、map(マップ)オブジェクトを戻り値(返り値)として返します。
第1引数には関数、第2引数以降は可変長引数であり、それぞれの引数に反復可能(iterable)なオブジェクトを指定することができます。
mapオブジェクトは イテレータ(iterator) であり、第1引数に与えた関数の条件に沿ったオブジェクトが生成されます。
TL;DR
基本
# 第1引数には関数、第2引数には反復可能なオブジェクトを指定する
tuple1 = ('1', '2', '3', '4', '5')
# 関数指定時に()丸括弧(parentheses)をつけないように注意
map1 = map(int, tuple1)
print(map1)
==> <map object at {オブジェクト識別値}>
# 型はmap型
print(type(map1))
==> <class 'map'>
# すべての要素がint型(整数)に変換されている
listed_map1 = list(map1)
print(listed_map1)
==> [1, 2, 3, 4, 5]
for element in listed_map1:
print(element, type(element))
==> 1 <class 'int'>
==> 2 <class 'int'>
==> 3 <class 'int'>
==> 4 <class 'int'>
==> 5 <class 'int'>
# 独自関数の指定
def plus_100(ele: int) -> int:
return ele + 100
list1 = [0, 1, 2, 3, 4]
map2 = map(plus_100, list1)
# 各要素に100がプラスされている
print(list(map2))
==> [100, 101, 102, 103, 104]
# lambda式の指定
list2 = ['py,js,ts,kt', 'python,javascript,typescript,kotlin']
map3 = map(lambda e: e.split(','), list2)
print(list(map3))
==> [['py', 'js', 'ts', 'kt'], ['python', 'javascript', 'typescript', 'kotlin']]
# filterとの組み合わせ
tuple2 = ('Python', 'JavaScript', 'Kotlin', 'Smalltalk')
map1 = map(lambda e: f'Love {e}', filter(lambda e: 'o' in e, tuple2))
# *(アスタリスク)演算子を使用して要素を展開
print(*map1, sep=',')
==> Love Python,Love Kotlin
# mapオブジェクトはイテレータなのでnext関数で値を取得可能
string1 = 'ABCDEFG'
map4 = map(lambda e: e.lower(), string1)
while e := next(map4, '-END-'):
if e == '-END-':
break
print(e, end=' ')
==> a b c d e f g
関連情報:forの使用方法
関連情報:type(組み込み関数)の使用方法
関連情報:whileの使用方法
関連情報:ifの使用方法
関連情報:filter関数の使用方法
関連情報:list(リスト・配列)の使用方法
関連情報:def(関数定義)の使用方法
関連情報:lambda(ラムダ式)の使用方法
関連1次情報::= セイウチ演算子
第2引数以降に複数の引数を指定
string1 = '123'
list1 = ['python', 'javascript', 'kotlin']
# e1,e1にstring1とlist1の要素がそれぞれ代入される
map1 = map(lambda e1, e2: f'{e1}:{e2}', string1, list1)
print(list(map1))
==> ['1:python', '2:javascript', '3:kotlin']
# 関数の引数は反復可能オブジェクトの数と同一でないとエラー
map1_2 = map(lambda e1: f'{e1}', string1, list1)
print(list(map1_2))
==> TypeError: <lambda>() takes 1 positional argument but 2 were given
# 引数にデフォルト値が設定されている場合はOK
map1_3 = map(lambda e1, e2, e3='OK': f'{e1}:{e2}:{e3}', string1, list1)
print(list(map1_3))
==> ['1:python:OK', '2:javascript:OK', '3:kotlin:OK']
list2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# map(ラムダ式, [1, 2, 3], [4, 5, 6], [7, 8, 9])と同じ
map2 = map(lambda e1, e2, e3: e1 + e2 + e3, *list2)
print(list(map2))
==> [12, 15, 18]
list3 = ['key1', 'key2', 'key3']
list4 = ['value1', 'value2']
map3 = map(lambda e1, e2: f'{e1}:{e2}', list3, list4)
# 要素数の少ないオブジェクトに合わせて処理される
print(list(map3))
==> ['key1:value1', 'key2:value2']
map関数を使用しない表現
# mapを使用する例
tuple1 = ('1', '2', '3', '4', '5')
map1 = map(int, tuple1)
print(list(map1))
==> [1, 2, 3, 4, 5]
# mapを使わない例:for
tuple1 = ('1', '2', '3', '4', '5')
listed_tuple1 = []
for e in tuple1:
listed_tuple1.append(int(e))
print(listed_tuple1)
==> [1, 2, 3, 4, 5]
# mapを使わない例:リスト内包表記(list comprehension)
tuple1 = ('1', '2', '3', '4', '5')
listed_tuple2 = [int(e) for e in tuple1]
print(listed_tuple2)
==> [1, 2, 3, 4, 5]
解説
基本
map関数は引数で指定した関数と反復可能(iterable)なオブジェクトを元に、map(マップ)オブジェクトを生成して戻り値(返り値)として返します。
第1引数には関数を、第2引数以降は可変長引数であり、それぞれの値に反復可能オブジェクトを指定します。 第1引数には関数としてlambda式を指定することができます。
第2引数に指定した反復可能オブジェクトの各要素に対し、第1引数で指定した関数が実行されます。 各要素は指定関数の第1引数に暗黙的に渡され、指定関数の戻り値を生成するmapオブジェクトをmap関数は生成します。
注意
mapオブジェクトはイテレータ(iterator)であるため、そのままでは値を参照(生成)することができません。
リスト化(list)、next関数、for文などを利用して値を生成してから要素にアクセスしてください。
string1 = '12345'
map1 = map(int, string1)
print(map1)
==> <map object at {オブジェクト識別値}>
print(type(map1))
==> <class 'map'>
# 各要素はint型になっている
print(list(map1))
==> [1, 2, 3, 4, 5]
# 独自関数の指定
def love(element: str) -> str:
return f'Love {element}'
list1 = ['Python', 'Golang', 'TypeScript']
# 関数指定時に()丸括弧(parentheses)をつけないように注意
map2 = map(love, list1)
print(list(map2))
==> ['Love Python', 'Love Golang', 'Love TypeScript']
# lambda式の指定
tuple1 = (10, 20, 30, 40)
map3 = map(lambda e: e ** 2, tuple1)
# *(アスタリスク)演算子を使用して要素を展開
print(*map3)
==> 100 400 900 1600
# mapオブジェクトはイテレータなのでnext関数で値を取得可能
string2 = 'ABC'
map4 = map(lambda e: e.lower(), string2)
while True:
try:
print(next(map4), end=' ')
except StopIteration:
break
==> a b c
関連情報:type(組み込み関数)の使用方法
関連情報:forの使用方法
関連情報:whileの使用方法
関連情報:ifの使用方法
関連情報:list(リスト・配列)の使用方法
関連情報:def(関数定義)の使用方法
関連情報:lambda(ラムダ式)の使用方法
関連情報:例外処理(try,except,else,finally)の使用方法
第2引数以降に複数の引数を指定
map関数の第2引数は可変長引数であり、1つ以上の反復可能オブジェクトを取ることが出来ます。
第1引数で指定した関数の引数の数は、第2引数以降の反復可能オブジェクトの数と同一に設定する必要があります。
(引数にデフォルト値が設定されている場合はその限りではありません。)
また、与えた反復可能オブジェクトの長さがそれぞれ異なる場合は、最も長さが短いオブジェクトに合わせた処理がなされます。
list1 = ['A', 'B', 'C']
list2 = ['a', 'b', 'c']
map1 = map(lambda e1, e2: e1 + e2, list1, list2)
print(*map1)
==> Aa Bb Cc
# 関数の引数は反復可能オブジェクトの数と同一でないとエラー
map1_2 = map(lambda e1: e1, list1, list2)
print(list(map1_2))
==> TypeError: <lambda>() takes 1 positional argument but 2 were given
# 引数にデフォルト値が設定されている場合はOK
map1_3 = map(lambda e1, e2, e3='---': e1 + e2 + e3, list1, list2)
print(list(map1_3))
==> ['Aa---', 'Bb---', 'Cc---']
tuple1 = ('key1', 'key2')
tuple2 = ('value1', 'value2', 'value3')
tuple3 = ('1', '2', '3')
map2 = map(lambda e1, e2, e3: f'{e1},{e2},{e3}', tuple1, tuple2, tuple3)
print(list(map2))
==> ['key1,value1,1', 'key2,value2,2']
map関数を使用しない表現
map関数を使用した処理は、Pythonの他の記述方法でも実現可能です。
このページでは代表的な例として、for文とリスト内包表記を用いた記述法を挙げています。
各場面で最適な方法を選択してみてください。
# mapを使用する例
tuple1 = ('A', 'B', 'C', 'D', 'E')
map1 = map(lambda e: e.lower(), tuple1)
print(list(map1))
==> ['a', 'b', 'c', 'd', 'e']
# mapを使わない例:for
tuple1 = ('A', 'B', 'C', 'D', 'E')
listed_tuple1 = []
for e in tuple1:
listed_tuple1.append(e.lower())
print(listed_tuple1)
==> ['a', 'b', 'c', 'd', 'e']
# mapを使わない例:リスト内包表記(list comprehension)
tuple1 = ('A', 'B', 'C', 'D', 'E')
listed_tuple2 = [e.lower() for e in tuple1]
print(listed_tuple2)
==> ['a', 'b', 'c', 'd', 'e']