2017-03-08 6 views
2

任意の文字列(単位は数値)を浮動小数点に変換したいと思います。私はpythonは、ユニットを持つ任意の文字列を浮動小数点に変換します。

myList = ["$800", "0.1mm", "54.6%", "100,000,000", "89.6", "1,017.16%"] 

のような値のリストを持っていると私はそれを変換したいと思います:

myList = [800.0, 0.1, 54.6, 100000000.0, 89.6, 1017.16] 

そして、私は複数を使用せずにこれを実行したいと思い.replace(「%」を一緒に積み重ね置き換え、 "").replace( " """))...(置き換える...

本当に簡単神託のソリューションがあるように私は感じて...

+1

を正規表現モジュールを使用することができます問題。 – user2357112

+1

これらの文字列から数値への変換は、トラップでいっぱいです。 –

+0

これは滑りやすい状況です。あなたのプログラムから来たリストの場合は、それを生成するコードを再考するほうがいいかもしれません。つまり、入力単位を修正し、出力単位でのみ表示します。 –

答えて

2

あなたはstr.translateを使用している可能性があり、しかし、ここの最善の方法はおそらくあなたが保持したいもの、つまり数字、点、マイナス記号を打ち消すことができるので、正規表現の置き換えが可能です。

import re 
myList = ["$800", "0.1mm", "54.6%", "100,000,000", "89.6", "1,017.16%"] 

newlist = [float(re.sub("[^0-9.\-]","",x)) for x in myList] 

print(newlist) 

結果:

[800.0, 0.1, 54.6, 100000000.0, 89.6, 1017.16] 

浮くためにあらゆる数に変換します。このような整数変換の候補を区別するために別の1、と理解を連鎖することにより、ドットなしている場合、たとえば、intに変換するために、洗練さでした:

newlist = [float(y) if "." in y else int(y) for y in (re.sub("[^0-9.\-]","",x) for x in myList)] 

(、考慮に科学的表記を"E" in yでしょう取ることはありません必要に応じて追加する必要があり、正規表現によってフィルタリングされません

結果が今である:。

[800, 0.1, 54.6, 100000000, 89.6, 1017.16] 
+0

正規表現 '[$ a-z、%]'は完全に堅牢ではないかもしれません。可能な負の値を処理するには '.'を追加する必要があり、マイナス記号を付けることは別として、' [^ 0-9] ' – lordingtar

+0

を使用することが正しいでしょう –

+0

ええ、 "追加されました...ありがとうございます。これは最も効果的ですが、あまりにも具体的になる(つまり、科学的表記法を追加する)のに近いです。他の誰もより良い選択肢がなければ、これを1日か2日で解決策としてマークします。ありがとうございました – laserpython

3

あなたは、各項目を反復処理し、唯一のを持つ数値である値を保つことによって、リストを置き換えることができますの組み込み関数。

myList = ["$800", "0.1mm", "54.6%", "100,000,000", "89.6", "1,017.16%"] 
new_list = [] 
for i in myList: 
    f = ''.join(x for x in i if x.isdigit() or x in ['.', '-']) 
    new_list.append(float(f)) 

または、単一行の発現について:

new_list = [float(''.join([x for x in y if x.isdigit() or x in ['.', '-'])) for y in myList] 

はEDIT:小数やネガを含む逃しました。一定。 1.2e384

EDIT2などの表記法をサポートしているかどうかわかりません。この全体的な状況は実際には安全ではないため、推奨しません。

+0

@NickAうわー、どのように私がそれを逃したのか知っている... – crookedleaf

+0

また、マイナス符号と、 '1.2e15'表記をサポートするかどうかについての決定が必要です。 – user2357112

+0

Goodpoint user2357112、多くの "or"ステートメントで多くのケースでフランケンシュタイン式に渦巻くことがあります – laserpython

1

あなたはそれだけでも、次元を無視して、 `「1m'`と`」等しいものとして扱われている1mm'`との奇妙な問題につながるだろうように、この音をpythonで

import re 
list = ["$800", "0.1mm", "54.6%", "100,000,000", "89.6", "1,017.16%"] 
subbed_list = [float(re.sub('[^0-9.\-]','',i)) for i in list] 
+0

これは素晴らしいですが、 "。" – laserpython

+0

私は "。"を追加しました。それは私の見解です。 – lordingtar

+0

@NickA編集: – lordingtar

関連する問題