【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、map 組み込み関数と使い分けることも必要ですね! 投稿一覧へ戻る

Tags: Python , miscellaneous , comprehension , challenge , map

Published 2020年8月9日17:27 by T.Tsuyoshi

さて、まずは次のコードを見て下さい。出力結果はどうなるでしょうか?


import operator


def stick_to_comprehension():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join([operator.mul(letter, number) for letter, number in zip(letters, numbers)])



letters と numbers という 2 つのシーケンスを定義しています。


zip() 組み込み関数を利用して、これらのシーケンスから 1 つのタプルのリストを作成し、


アンパックを利用して 1 つ 1 つのタプルの要素を取り出して、


要素同士を掛け合わせた結果を要素とするリストを作って、


全ての要素を ' ' ( スペース ) をセパレータとして繋ぎ合わせて 1 つの文字列を作成しています。


ということで、


print(stick_to_comprehension())

# a bb ccc dddd



という出力結果になります。


comprehension は、従来の filter() 関数と map() 関数を利用して実現していたことを、簡潔に記述することが可能です。
(この例では if 文が組み込まれていないので、filter 機能は実装していませんが...)


確かに便利です。


ですが、この例のように複数のシーケンスを対象にして何らかの処理を加えた新しいシーケンスを作成する場合は、


実は map() 組み込み関数を利用したほうが簡潔に記述できちゃうんです。


では、map() 関数を利用して同じ結果を取得できるように作り直してみてください。


制限時間 10 分:


import operator


def using_map():
letters = 'abcd'
numbers = range(1, 5)

pass



いかがですか?


map() 関数の定義はこうなっています。


map(function, iterable, ...)



map() 関数は iterable を複数受け取ることが可能で、要素を function に渡す前に zip() を利用して要素を集めたシーケンスを作成します。


ですから、いちいちこちら側で zip() を適用する手間が必要ないんです。


ということで、


import operator


def using_map():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join(map(operator.mul, letters, numbers)))


print(using_map())

# a bb ccc dddd



が正解例になります。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)