7

次のような形式の文字列のリストがあります

a = ['str','5','','4.1']

このように、リスト内のすべての数値を float に変換したいが、残りは変更しないでおく

a = ['str',5,'',4.1]

私は試した

map(float,a)

しかし、一部の文字列をfloatに変換できないため、明らかにエラーが発生しました。私も試しました

a[:] = [float(x) for x in a if x.isdigit()]

しかし、それは私に与えるだけです

[5]

そのため、浮動小数点数と他のすべての文字列が失われます。文字列と数値を同時に保持するにはどうすればよいですか?

4

4 に答える 4

7
>>> a = ['str','5','','4.1']
>>> a2 = []
>>> for s in a:
...     try:
...         a2.append(float(s))
...     except ValueError:
...         a2.append(s)
>>> a2
['str', 5.0, '', 4.0999999999999996]

10 進数の計算を行っている場合は、decimal モジュールを確認することをお勧めします。

>>> import decimal
>>> for s in a:
...     try:
...         a2.append(decimal.Decimal(s))
...     except decimal.InvalidOperation:
...         a2.append(s)
>>> a2
['str', Decimal('5'), '', Decimal('4.1')]
于 2013-01-31T19:37:43.310 に答える
6
for i, x in enumerate(a):
    try:
        a[i] = float(x)
    except ValueError:
        pass

これは、その場で変更することを前提としていますa。新しいリストを作成するには、次を使用できます。

new_a = []
for x in a:
    try:
        new_a.append(float(x))
    except ValueError:
        new_a.append(x)

この try/except アプローチは標準の EAFPであり、各文字列が有効な float かどうかを確認するよりも効率的でエラーが発生しにくくなります。

于 2013-01-31T19:36:45.420 に答える
5

例外を処理せずに正規表現を少し使用してそれを行う方法は次のとおりです:-

>>> a = ['str','5','','4.1']
>>> import re
>>> [float(x) if re.match("[+-]?(?:\d+(?:\.\d+)?|\.\d+)$", x) else x for x in a]
4: ['str', 5.0, '', 4.1]

この正規表現は、あなたの場合に適用できる基本的な範囲の数値のみをカバーすることに注意してください。指数を含む、より広範囲の浮動小数点数に一致するより複雑な正規表現については、次の質問を参照してください。-

于 2013-01-31T19:43:20.127 に答える
4

私のバージョン:

def convert(value):
    try:
        return float(value)
    except ValueError:
        return value

map(convert, a)
于 2013-01-31T19:49:27.900 に答える