Python 内包表記とlambdaの書き方

内包表記とlambdaの書き方(結論)

1
2
3
4
5
# 内包表記
B = list(map(lambda x: x*x, A))

# lambda
B = [x*x for x in A]

今、数値のリストAがあるとする。
Aの要素を全て二乗したリストBを得る方法を考える。

様々な方法で実装

準備

  • 0~99までの要素数100のリストA
  • 数を二乗する関数square
    1
    2
    3
    A = range(100)
    def square(a):
    return a*a

    方法1. for文 + square関数

    まずは最も愚直な方法を考える。

最初に空のリストを用意して、ループを回して、と手順が複雑。

1
2
3
4
B = []
for a in A:
B.append(square(a))
print (B)

方法2. map + square関数

高階関数mapを使うと下記のようにシンプルにかける。

Python3では、2までと違いmapはリストではなくイテレータを返すため、リストへの変換が必要。

1
2
B = list(map(square, A))
print (B)

方法3. map + lambda

関数をこの箇所でしか使わない場合、わざわざ宣言をしないという方法もある。

それが、lambdaを用いた方法である。

1
2
B = list(map(lambda x: x*x, A))
print (B)

方法4. リスト内包表記

リスト内包表記が最もシンプルだろう。

1
2
B = [x*x for x in A]
print (B)

おまけ 実行時間の比較

今回のケースでは、内包表記が最も速い。

1
2
3
4
5
>>> %%timeit
>>> B = []
>>> for a in A:
>>> B.append(square(a))
18.1 µs ± 257 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1
2
3
>>> %%timeit
>>> B = list(map(square, A))
10.1 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1
2
3
>>> %%timeit
>>> B = list(map(lambda x: x*x, A))
12.2 µs ± 195 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1
2
3
>>> %%timeit
>>> B = [x*x for x in A]
5.89 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

listとnumpy.ndarrayの速度比較にも興味がある方は、Pythonにおけるリスト(list)と配列(array)の違いをご覧ください。