Tocyukiのブログ

ギターと柔術とプログラミングが好き!

Pythonで文字列をリスト化するTips

やりたいこと

  • たとえばこんな文字列をそのままリスト化したいときなどに
  • 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のほかにfilterreduceなどの高階関数があります。

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関数をつかわなくてもリスト内包表記で同じような結果が得られますが、まぁ、これは好みの問題かもしれないです。
実行速度もどちらが早いというわけでもないですが、読みやすいコードであればどちらでもいいのかなというのが私の見解です。