Python 反復処理 #8 内包表記 #2

株式会社リュディアです。Python の内包表記についての続きです。今回は他の機能と組み合わせてみます。

前回までの反復処理のまとめへのリンクは以下を参考にしてください。

前回のまとめにも書きましたが内包表記は記述が簡潔になる一方で複雑な処理を無理して利用すると可読性が落ちる可能性があります。簡潔かつ可読性があがる場合は積極的に利用してください。独りよがりな記述にならないように注意してください。

最初はループ中に if 文がある場合を例とします。まず内包表記を使わない記述です。

l_squares = []
for i in range(5):
   if i%2 == 0:
       l_squares.append(i**2)
print(l_squares)

>> [0, 4, 16]

for ループで 0 ~ 4 まで反復し  i%2 == 0 つまり偶数の場合だけリスト l_squares に追加します。これを内包表記で記述してみましょう。

l_squares = [i**2 for i in range(5) if i%2 == 0]
print(l_squares)

>> [0, 4, 16]

私は内包表記による記述が簡潔かつ可動性もあがっていると思います。次は zip 関数を使った例を扱います。まず内包表記を使わない記述です。果物のリスト l_a、肉のリスト l_b から同じ要素番号のものをタプルの組としリストに追加しています。

l_a = ['Apple', 'Orange', 'Banana']
l_b = ['Beef', 'Chicken', 'Poke']

l_out = []
for fruit, meat in zip(l_a, l_b):
   l_out.append((fruit, meat))
print(l_out)

[('Apple', 'Beef'), ('Orange', 'Chicken'), ('Banana', 'Poke')]

この例を内包表記で記載すると以下のようになります。

l_a = ['Apple', 'Orange', 'Banana']
l_b = ['Beef', 'Chicken', 'Poke']

l_zip = [(fruit, meat) for fruit, meat in zip(l_a, l_b)]
print(l_zip)

[('Apple', 'Beef'), ('Orange', 'Chicken'), ('Banana', 'Poke')]

こちらも私は簡潔かつ可読性もあがっていると思うのですが、人によっては抵抗があるかもしれません。とにかく Python では可読性を最優先して無理な記述をしないように心がけてください。内包表記は Python らしい記述になる一方で、あまりにテクニカルな記述になると可読性が下がるということは意識してください。誰もが読みやすい、頭の中での理解を妨げないようなコーディングが最重要だと考えます。

では、ごきげんよう。

この記事が気に入ったらサポートをしてみませんか?