AtCoderでコーディングの練習をしています。みなさんも一緒に精進しましょう。
さて, Pythonのリスト内包表記を使ってリストを新規作成したいとき,if文を噛ませることによって条件に応じてリストに追加する値に変化をつけることができます。
ただしif文の噛ませ方には主に2つの方法があり, 少し挙動が異なるため, その違いについて知っておく必要があります。
0. 通常のリスト内包表記
# 1の2乗から5の2乗まで順番に格納したリストをつくりたい
# 普通の書き方
mylist = []
for i in range(5):
mylist.append(i**2) #[1, 4, 9, 16, 25]
# リスト内包表記
mylist = [ i**2 for i in range(5) ] #[1, 4, 9, 16, 25]
1. リスト内包表記とifの併用
# 1の2乗から5の2乗までのうち, 10より大きいものだけを順番に格納したリストをつくりたい
# 普通の書き方
mylist = []
for i in range(5):
if i**2 > 10:
mylist.append(i**2) #[16, 25]
# リスト内包表記
'''
"""for文の後ろに"""if文を書く
リスト内包表記そのものに備わっている機能
条件式が True となる i についてのみ要素が追加される
それ以外の i については要素は追加されない
'''
mylist = [ i**2 for i in range(5) if i**2 > 10 ] #[16, 25]
2. リスト内包表記とif-elseの併用
# 1の2乗から5の2乗までを順番に格納したリストをつくりたい
# ただし, 10より大きいものはそのまま格納し, 10より小さいものは-1に変えて格納したい
# 普通の書き方
mylist = []
for i in range(5):
if i**2 > 10:
mylist.append(i**2)
else:
mylist.append(-1) #[-1, -1, -1, 16, 25]
# リスト内包表記
'''
"""for文の前に"""if-elseを記載する
if-elseを1行で記載できる機能
((真の場合の値) if (条件式) else (偽の場合の値))
を利用したもの
'''
mylist = [ i**2 if i**2 > 10 else -1 for i in range(5) ] #[-1, -1, -1, 16, 25]
3. エラーとなる場合
# if-elseを"""for文の後ろ"""に置くとエラー
mylist = [ i**2 for i in range(5) if i**2 > 10 else -1]
File "<string>", line 1
mylist = [ i**2 for i in range(5) if i**2 > 10 else -1]
^
SyntaxError: invalid syntax
# elseなしのif文を"""for文の前"""に置くとエラー
mylist = [ i**2 if i**2 > 10 for i in range(5) ]
File "<string>", line 1
mylist = [ i**2 if i**2 > 10 for i in range(5) ]
^
SyntaxError: invalid syntax