[Python]1行で書くfor文、if文

2022年1月9日日曜日

Python

Pythonでコード量をぐっと減らす内包表記、三項演算子を紹介します。

内包表記

for文を1行に書くことができる表現です。
for文に使用できるイテラブルなオブジェクトで使用可能です。
[式 for 変数名 in イテラブルなオブジェクト]で記述可能です。

list_1 = [1, 2, 3, 4, 5]

double_list_1 = []
for item in list_1:
    # list_1の各要素の2倍を格納
    double_list_1.append(item*2)

print(double_list_1)
# [2, 4, 6, 8, 10]

# 上記を内包表記で書くと1行に収まる
double_list_2 = [ item*2 for item in list_1 ]
print(double_list_2) # [2, 4, 6, 8, 10]

内包表記と条件式

内包表記にはif文を含めることもできます。
[式 for 変数名 in イテラブルなオブジェクト if 条件文]で記述可能です。

list_1 = [1, 2, 3, 4, 5]

double_list_1 = []
for item in list_1:
    # list_1の要素の内、偶数のみ2倍
    if item % 2 == 0:
        double_list_1.append(item*2)

print(double_list_1)
# [4, 8]

# 上記を内包表記で書くと1行に収まる
double_list_2 = [ item*2 for item in list_1 if item % 2 == 0]
print(double_list_2) # [4, 8]

ネストした内包表記

for文の中にfor文を記載するネストも内包表記で一行で記載可能です。
[式 for 変数名1 in イテラブルなオブジェクト1 for 変数名2 in イテラブルなオブジェクト2...]で記述可能です。

list_1 = [[1,2],[3,4],[5,6]]

double_list_1 = []
for item_1 in list_1:
    for item_2 in item_1:
        double_list_1.append(item_2*2)

print(double_list_1)
# [2, 4, 6, 8, 10, 12]

# for文のネストも内包表記で1行
double_list_2 = [item_2*2 for item_1 in list_1 for item_2 in item_1]
print(double_list_2)
# [2, 4, 6, 8, 10, 12]

三項演算子

続いて、if文を1行で記載する表現です。
三項演算子で1行で表現することができます。
条件が成立した時の値 if 条件 else 条件が成立しなかった時の値で記述可能です。

target = 2
result_1 = 0

if target % 2 == 0:
    result_1 = target*2
else:
    result_1 = target*3
print(result_1) # 4

# 三項演算子で1行
result_2 = target*2 if target % 2 == 0 else target*3
print(result_2) # 4

ネストした三項演算子

ネストしたif文も三項演算子で表現可能です。
条件1が成立した時の値 if 条件1 else 条件1が成立しなかった時の値 if 条件2 else 条件2が成立しなかった時の値で記述可能です。

target = 7

result_1 = 0
if target % 2 == 0:
    result_1 = target*2
elif target % 3 == 0:
    result_1 = target*3
else:
    result_1 = target*10
print(result_1) # 70

# 三項演算子で1行
result_2 = target*2 if target % 2 == 0 else target*3 if target % 3 == 0 else target*10
print(result_2) # 70

まとめ

for文、if文をすっきりさせる内包表記、三項演算子について紹介させていただきました。
紹介させていただきましたが、乱用には注意です。
特にネストした三項演算子の乱用は可読性が落ちます
見やすいコードを目指して書いていたはずが、気付けば見にくいコードになってしまうような本末転倒な結果にならないようにご注意ください。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology