やるだけPython競プロ日誌

競プロの解説をPythonでやっていきます。できるだけ初心者に分かりやすいように『やるだけ』とかは言わないようにします。コメントについては必ず読んでいます。どんなに細かいことでもいいのでコメントくださればうれしいです。

Python3 ~map関数について~

今回は map()関数 についてお話します。

簡単に言うと、リストやタプルなどのシーケンスに対してmap(a, b) はbに対してaしたものを返す。ということです。

たとえば

def double(n):
    return (int(n) * 2)
lis = ["114514", "810", "893"]
print(list(map(double, lis)))  # [229028, 1620, 1786]

というように、全ての要素を引数として読み込みそれぞれ"114514", "810", "893"に対して ×2をして返します。

分岐・ループ

lis = ["1024", "23", "16", "256", "1", "32"]
def beautify(n):
    m = format(int(n), "b")
    if m == "1" + "0" * (len(m) - 1) and n != "1":
        return n
    else:
        return '1024'  # 2の累乗数ならそのままreturnし、そうでないなら最も美しい数をreturnする。
print(list(map(beautify, lis)))  # ['1024', '1024', '16', '256', '1024', '32']

というように、分岐やループが入っているようなものも可能です。

lambda式

あるいはlambda式も使えますので

lis = ["114514", "810", "893"]
print(list(map(lambda n:int(n)*2, lis)))  # [229028, 1620, 1786]

というようにも扱えます。

ですが、map関数を使おうとしてできることは、大方リスト内包表記も使えます。そちらのほうがほとんどの場合高速なので、リスト内包表記を使うほうが良いと個人的に思います。

lis = ["114514", "810", "893"]
print([int(n) * 2 for n in lis])  # [229028, 1620, 1786]

ちなみに、このmap関数が返すのはmap型です。これ自体を直接見ることはできないので、毎回list()としてリストに変換しています。