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