
【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、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)])
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
# a bb ccc dddd
という出力結果になります。
comprehension は、従来の filter() 関数と map() 関数を利用して実現していたことを、簡潔に記述することが可能です。
(この例では if 文が組み込まれていないので、filter 機能は実装していませんが...)
確かに便利です。
ですが、この例のように複数のシーケンスを対象にして何らかの処理を加えた新しいシーケンスを作成する場合は、
実は map() 組み込み関数を利用したほうが簡潔に記述できちゃうんです。
では、map() 関数を利用して同じ結果を取得できるように作り直してみてください。
制限時間 10 分:
import operator
def using_map():
letters = 'abcd'
numbers = range(1, 5)
pass
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
def using_map():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join(map(operator.mul, letters, numbers)))
print(using_map())
# a bb ccc dddd
が正解例になります。
こちらの投稿にも興味があるかもしれません...
- 【Python 雑談・雑学 + coding challenge】Python data structure の1つ、set を活用していますか? 複数のシーケンスの包含関係を調べるには最適です
- 【Python 雑談・雑学 + coding challenge】Unicode の正規化処理 ( normalization ) を利用して、diacritical marks ( 発音区別符号 ) を取り除こう! テキスト解析の前処理としても重要です!
- 【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。
- 【Python 雑談・雑学 + coding challenge】sorted 組み込み関数の key パラメータをうまく使って、カスタムオブジェクトを簡単にソートしよう! __getitem__、__len__ 特殊関数 ( special methods, dunder methods ) を実装すれば立派なシーケンス ( sequence ) です
0 comments
コメントはまだありません。
コメントを追加する(不適切と思われるコメントは削除する場合があります)