Python のリスト内包表記に、if ~ だけでなく、else ~ を付ける方法

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

以下で else 句を実装できる。

[(処理1)if (条件式) else (処理2) for 仮引数 in (リストオブジェクト)]


Python でリスト内包表記でコードを書くとき、if 条件に該当しないリスト要素にも処理を実装させるために、else 句 が書けないか調べてみたら、以下のウェブサイトを見つけました。

( 参考ウェブサイト )

soyogu (2013年8月8日付)「Python 内包表記 if else」

【 実行例 】

まずは、冒頭の参考ウェブサイトのコードを試してみます。

Python 2.7
data_list = [0, 1, 2, 3, 4, 5, 6, 7]

[x if x <5 else 'larger' for x in data_list]

pic_1.png

意図したとおり、リスト要素のうち、5未満の要素はもともとの値のまま出力し、それ以外(5以上)の要素は、文字列リテラル larger に変換して、新しいリストを生成できています。

次に、「5未満」の条件に合致しない else の場合の処理を、元の値の2乗に変えてみます。

Python 2.7
[x if x <5 else x**2 for x in data_list]

pic_2.png

これも、うまく動きました。

次に、リスト要素を 数値型 と 文字列型 を混ぜて、文字列型の要素はそのままの値を出力し、数値型の要素のみ、2乗した新しいリストを得てみます。

Python 2.7
data_list_2 = [0, 1, 'NULL', 3, 'xxx', 5, 6, 7]

[x**2 if type(x)==int else x for x in data_list_2]

pic_3.png

pic_5.png

以下でも同じ結果が得られます。

Python 2.7
[x if type(x)!=int else x**2 for x in data_list_2]

add.png


【 その他 】

実際にコードを書いて業務を処理させる場面でよくでてくる、データベースから、NULL や 空欄 、nan.aN.A. を含んだ数値データを、パーセント表示に変える処理を実装してみます。

途中、試めしにいろいろなコードを書いていますが、最終的には以下のコードを実行しています

\ は、Python の改行コードです。
インタプリタで実行する際にターミナル画面からコードがはみ出る場合や、
スクリプトを書く際にエディタ画面からはみ出る場合に記述します。
(コードの中身そのものに関わる記号ではありません)

Python2.7
from decimal import Decimal
import types

data_lit_3 = [0.01, 0.07, 'NULL', 0.08, 'na', '']

['%g%%' % y if type(y)==Decimal else y for y in [Decimal(str(x))*Decimal('100') if type(x)==float else x for x in data_list_3]]

得られた結果は、以下で、意図したとおりです。

['1%', '7%', 'NULL', '8%', 'na', '']

Python_if_else_percent_2.png

Python_if_else_trial_3.png

小数点のfloat型オブジェクトを、パーセント表示に変換する部分のコードは、以下のウェブサイトから学ばせて頂きました

(2010年9月13日付)「Python で小数をパーセント表示にしたい」

decimal モジュール

進数を正確に表現できるそうです。

from decimal import Decimal
lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
print [Decimal(str(x)) for x in lst]
[Decimal('0.01'), Decimal('0.201'), Decimal('0.1575'), Decimal('0.025'), Decimal('0.322'), Decimal('0.65')]
str() よりも repr() の方がいいのかな?? もうちょっと調べなくっちゃ。

ただ、Decimal でも10進数の無限小数となる場合は誤差が生じるそうです。要注意。

結果

文字列フォーマット操作なんかも使って

from decimal import Decimal
lst = [0.01, 0.201, 0.1575, 0.025, 0.322, 0.65]
print ['%g%%' % y for y in [Decimal(str(x))*Decimal('100') for x in lst]]
['1%', '20.1%', '15.75%', '2.5%', '32.2%', '65%']
できたー