Pythonのmapについて自分なりのまとめ2

Python

前回のブログで書いた事

前回はPythonチュートリアルのmapの説明の内、”Return an iterator that applies function to every item of iterable, yielding the results.”の部分から始め、”If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel.”のIterable argumentsが追加された場合に便利、と言う結論に至っていました。

これを書いた時は、最初の”Return an iterator that applies function to every item of iterable, yielding the results.”についてはmapの方が少し早い位で大差ない、と言う理解でした。

しかし

勘違いしていました

実は最初の”Return an iterator that applies function to every item of iterable, yielding the results.”の部分も重要だった。

例えばリストを作る時の話

例えば外部から複数の数字をスペースで区切ったデータを入力、数値としてリスト化する場合を考えます。

データは

1 2 3 4 5

の形で与えられた場合を考えます。
問題でもよくある形式です。

これ普通にやると結構手間です。

>>> ilist = []
>>> nlist = input()
1 2 3 4 5 # データ入力
>>> nlist
'1 2 3 4 5'

数字1 2 3 4 5をinputするとまずstring(文字)になりますので、5行目の様にまずは’1 2 3 4 5’と言う文字列になります。

次にnlistを一度スペースで区切ったリストにした上で各要素をint()で数値にし、その数値を最初に作った空リストilistにappend(後方追加)します。

>>>for i in nlist.split():
>>>    ilist.append(int(i))
>>>print(ilist)
[1, 2, 3, 4, 5]

これでやっとこできあがり。

ちなみに、
nlist = list(input())
と、inputした1 2 3 4 5をそのままリスト化すると、空白(スペース)も一文字になった
[‘1’, ‘ ‘, ‘2’, ‘ ‘, ‘3’, ‘ ‘, ‘4’, ‘ ‘, ‘5’]と言うリストが出来てしまうので却下。

と言う事で結構コネコネしないと数値のリストは出来ません。

mapさんはここが凄い!

しかし、mapを使うと一行で数値のリストが作れます。

functionをそれぞれに適用する、と言う事で”int”をfunctionとしてiterable item各々に適用します。

>>> nlist = list(map(int, input().split()))
1 2 3 4 5
>>> nlist
[1, 2, 3, 4, 5]

以上。一行目で終わっています。

上手く使えば色々な可能性が広がります。

脱線してmapの挙動を見るmapをnlistに直接代入した場合

ここまで来たのでついでに、mapの挙動についてもう少し見てみたい。
例えばリストに入れずにmapを直で代入するとどうなるのか。

>>> nlist = map(int, input().split())
1 2 3 4 5

この様にlistを取ったnlistに1 2 3 4 5をinputすると、nlistはlistを返さず、iteretorと言う続きデータ的な物を返します。
printしてみると良く分かります。

>>> print(nlist)

この様に、iteratorのメモリ上の位置を返してきます。

1 2 3 4 5はどこ行った??
とよく悩んだものです。

今なら分かります。listに入れないmapはただのiteratorなんです。そのままでは見えません。なんか禅問答みたいですね。

でも大丈夫、ちゃんと見る方法はあります。手作業でiterationさせるのです。next()を使用します。

 >>> next(nlist)
1
>>> next(nlist)
2
>>> next(nlist)
3
>>> next(nlist)
4
>>> next(nlist)
5
>>> next(nlist)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

この様に、next(nlist)を入力する度に1つずつiterationさせる事が出来ます。

inputしたデータは1 2 3 4 5なので、5でiterationは終わり、もう一度next(nlist)を入力するとiterationの終了を示します(StopIteration)。

以上、mapはそれだけではつかみ所が無いもので、listやtupleに入れると使えます。う〜ん、更にmapが分かってきました。

最後にList comprehension

最後にもう一つ、実はList comprehensionで書くと、mapと同様に一行で書ける事に気づきました。

>>> nlist = [int(i) for i in input().split()]
1 2 3 4 5
>>> nlist
[1, 2, 3, 4, 5]

さすがはList comprehension、便利ですね。
とは言え、状況次第で使い分けられると良い感じ。

コメント

タイトルとURLをコピーしました