文字列内の浮動小数点数をfloat型に変換したい

How to get float value (i.e. 92.91%) from [u’ 92.91%\n ‘] in python – StackOverflow

意外に「EAFP」な回答が無い.

def pcng2float(s):            
    try:
        res = s.strip()
        if res.endswith('%'):
            return float(res[:-1])
        else:
            return float(res)
    except (ValueError, TypeError) as e:
        print(e)
        return None


elements = [u'  92.91%\n ', u'  98.71%\n ' ,u'  93.81%\n ', '50 %', '100%', '100', 'None%', 'A', '120']
[pcng2float(s) for s in elements]

could not convert string to float: ‘None’
could not convert string to float: ‘A’
[92.91, 98.71, 93.81, 50.0, 100.0, 100.0, None, None, 120.0]

文字列の中から任意の要素をピックアップしようと思うと,
ついつい正規表現を思い浮かべてしまうけど,
目的や要求される機能を考えた場合,正規表現はオーバーキル.

import re


elements = [u'  92.91%\n ', u'  98.71%\n ' ,u'  93.81%\n ', '50 %', '100%', '100', 'None%', 'A', '120']

score = []
for e in elements:
    m = re.search('\d+(\.\d+)?', e)
    score.append(float(m.group(0)) if m else None)

score

[92.91, 98.71, 93.81, 50.0, 100.0, 100.0, None, None, 120.0]

正規表現は確かに便利だけど.

「パーセンテージ表記或いはパーセントな文字列」という明確なターゲットがあって,
それを浮動小数点数に変換したいという目的な場合,
入力は常にその様であるという仮説に基いてメインロジックを考える.
仮説が間違いだった場合,例外処理を行うという流れの方がPython的.

面倒くさいから,ついつい「except Exception」しちゃうけど,
例外処理もあくまで仮説に基いて,例えば「ValueError」や
「TypeError」が想定されるとか,
想定外だった場合はexceptしたら駄目だろう.

例えば,ここでは「AttributeError」を想定せず,
入力は文字列(str型)だけと考えているので,
仮に入力にリストとか来ると,「AttributeError」を出す.
(’list’ object has no attribute ‘strip’)
(フラット化は別の関数の仕事)

EAFP – Python3.6.3ドキュメント

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false.

 
関連:
EAFP

Pythonで有効数字

整数値3桁カンマ区切り,小数点部3桁スペース区切りで表示(print) with Python

カテゴリー: 未分類 パーマリンク

文字列内の浮動小数点数をfloat型に変換したい への1件のフィードバック

  1. ピンバック: テキストファイルの読み込み | 粉末@それは風のように (日記)

コメントは受け付けていません。