リストの内包表記にif...else文がある場合、初心者はコードの読む順番に戸惑うことがあると思います。
>>> x = [8,1,7,2,6,3,5,4]
内包表記のif
>>> l1 = [i for i in x if i > 5]
>>> l1
[8, 7, 6]
ここでのif i > 5
は内包表記の一部となります。
次のコードと等価です:
>>> l1 = []
>>> for i in x:
... if i > 5:
... l1.append(i)
...
>>> l1
[8, 7, 6]
内包表記でのif...else
>>> l2 = [i if i > 5 else 0 for i in x]
>>> l2
[8, 0, 7, 0, 6, 0, 0, 0]
ここでのi if i > 5 else 0
は内包表記のシンタックスではありません。
次のコードと等価です:
>>> l2 = []
>>> for i in x:
... l2.append(i if i > 5 else 0)
...
>>> l2
[8, 0, 7, 0, 6, 0, 0, 0]
条件式
上記のi if i > 5 else 0
は条件式という演算です。
>>> i = 6
>>> i if i > 5 else 0
6
>>> i = 4
>>> i if i > 5 else 0
0
ちなみに
条件式ではelseがないと怒られます。
>>> i = 6
>>> i if i > 5
File "<stdin>", line 1
i if i > 5
^
SyntaxError: invalid syntax
なので
下記のように書いても同じく怒られます。
>>> l3 = [i if i > 5 for i in x]
File "<stdin>", line 1
l3 = [i if i > 5 for i in x]
^
SyntaxError: invalid syntax