やりたいこと
- たとえばこんな文字列をそのままリスト化したいときなどに
str
型の数字をint
型に直してリスト化したいときなど
コード
map関数をつかった場合
>>> text = '1 2 3 4 5'
>>> num_list = list(map(int, text.split(' ')))
>>> num_list
[1, 2, 3, 4, 5]
>>> text = 'A B C D E'
>>> word_list = list(map(str, text.split(' ')))
>>> word_list
['A', 'B', 'C', 'D', 'E']
リスト内包表記をつかった場合
>>> text = '1 2 3 4 5'
>>> num_list = [int(num) for num in text.split(' ')]
>>> num_list
[1, 2, 3, 4, 5]
>>> text = 'A B C D E'
>>> word_list = [word for word in text.split(' ')]
>>> word_list
['A', 'B', 'C', 'D', 'E']
解説
map関数をつかった場合
なんといってもキモはmap
関数なわけですが、map
関数はリストのような複数の要素をもったオブジェクト(シーケンス)と関数を引数としてうけとり、そのシーケンスの各要素をうけとった関数にわたして実行してくれます。
このように、関数をうけとる関数を高階関数と呼び、関数型言語でよく使われる機能です。
Pythonではmap
のほかにfilter
、reduce
などの高階関数があります。
map
関数の使い方は以下のように、第一引数が関数(またはlambda式)、第二引数がシーケンスとなります。
map(function, sequence_object)
以下はさきほどのnum_list
をつかってlambda
関数をつかったmap
関数の例ですが、Python3.xではmap
関数の返り値はmap型のオブジェクトとなります。
リスト型のオブジェクトとして使いたい場合はlist
関数などを使用します。
>>> num_list
[1, 2, 3, 4, 5]
>>> map_object = map(lambda x: x**2, num_list)
>>> map_object
<map object at 0x7f133c9660f0>
>>> type(map_object)
<class 'map'>
>>> list(map_object)
[1, 4, 9, 16, 25]
リスト内包表記をつかった場合
map
関数をつかわなくてもリスト内包表記で同じような結果が得られますが、まぁ、これは好みの問題かもしれないです。
実行速度もどちらが早いというわけでもないですが、読みやすいコードであればどちらでもいいのかなというのが私の見解です。