Pythonの基礎(配列/for文)



Pythonの配列の種類

  • List
>>> list = [1, 2, 3, 4]
>>> type(list)
<class 'list'>

  • Tuple
>>> t = (1,2,3,4)
>>> type(d)
<class 'set'>

  • Dict
>>> dic = {1:'hoge', 2:'piyo'}
>>> type(dic)
<class 'dict'>

  • Set
>>> d = {1,2,3,4}
>>> type(d)
<class 'set'>


リスト内包表記

  • for文
    ループで偶数のみを取り出しています。
>>> numlist = [1, 2, 3, 4, 5]
>>> num1 = []
>>> for num in numlist:
...     if num % 2 == 0:
...         num1.append(num)
... 
>>> print(num1)
[2, 4]

  • リスト内包記述
    for文を1行で書くことができます。
    通常のfor文よりも簡潔な記述になります。
>>> numlist = [1, 2, 3, 4, 5]
>>> num2 = [num for num in numlist if num % 2 == 0]
>>> print(num2)
[2, 4]

  • ラムダ式
    if文の条件をラムダ式のfilter()を使って書くことができます。
    左から順番に処理を書くので、リスト内包表記よりも処理がわかりやすい気がしました。
    ちなみに、Python2系ではlistオブジェクトで返却されますが、Python3系からiteratorオブジェクト(<filter object 〜>)を返却するようになったので、listへの変換が必要になります。
>>> numlist = [1, 2, 3, 4, 5]
>>> num3 = list(filter(lambda x : x % 2 == 0, numlist))
>>> print(num3)
[2, 4]


処理速度の計測

処理速度を計測してみたところ、リスト内包表記が1番高速でした。
ラムダ式は処理時間がかかってしまうので、コードの見やすさと処理速度を考慮すると、1番良いのはリスト内包表記かと思います。
import time


def main():
    numlist = [1, 2, 3, 4, 5]

    # for文
    start_time = time.clock()
    num1 = []
    for num in numlist:
        if num % 2 == 0:
            num1.append(num)

    end_time = time.clock()
    print(num1)
    print(('time: {}').format(end_time - start_time))

    # リスト内包記述(if文)
    start_time = time.clock()
    num2 = [num for num in numlist if num % 2 == 0]
    end_time = time.clock()
    print(num2)
    print(('time: {}').format(end_time - start_time))

    # ラムダ式
    start_time = time.clock()
    num3 = list(filter(lambda x : x % 2 == 0, numlist))
    end_time = time.clock()
    print(num3)
    print(('time: {}').format(end_time - start_time))


if __name__ == '__main__':
    main()
実行結果
[2, 4]
time: 4.9999999999980616e-06
[2, 4]
time: 2.9999999999960614e-06
[2, 4]
time: 6.0000000000060005e-06


まとめ

今までJavaを使っていたこともあり、ラムダ式を使いたい気持ちがあったのですが、処理速度が遅かったのが想定外でした。
自分が慣れているかではなく、性能と可読性を考慮して実装をしていきたいと思います。