5

次のようなリストがあるとします。

a = ['hello','1','hi',2,'something','3'] 

文字列を保持したまま、リスト内の数値を float に変換したい。

私はこれを書きました:

for i in a:
    try:
        i = float(i)
    except ValueError:
        pass

これを行うためのより効率的できちんとした方法はありますか?

4

5 に答える 5

4

すでに試したことに基づいて:

a = ['hello', '1.0', 'hi', 2, 'blah blah', '3']

def float_or_string(item):
    try:
        return float(item)
    except ValueError:
        return item


a = map(float_or_string, mylist)

トリックを行う必要があります。try:... except:...ブロックは、a) 効率的であり、b) すっきりしていると言えます。halex が指摘したように、そのmap()場でリストを変更せず、新しいリストを返し、それにa等しく設定します。

于 2012-10-19T06:38:16.540 に答える
1

変数の値を変更していますi-> 配列の内容はa変更されません! 配列の値を変更したい場合は、次のように実装する必要があります。

for index, value in enumerate(a):
    try :
        a[index] = float(value)
    except ValueError :
        pass
于 2012-10-19T06:35:48.830 に答える
1

try/except の方法は Python の方法ですが、それが本当に嫌な場合は、これが目的に合っているかどうかを確認してください。

a = ['hello','1','hi',2,'something','3']  

pattern = re.compile(r'^(-?\d+)(\.\d+)?') 

b = [float(item) if isinstance(item, str) and re.match(pattern, item) 
else item for item in a] 
于 2012-10-19T06:40:45.967 に答える
0

私の短い例はどうですか:

a = ['hello','1','hi',2,'something','3']

for i, item in enumerate(a):
    if str(item).isdigit():
        a[i] = float(item)

print a
于 2012-10-19T06:45:37.333 に答える
0

これは短くて良い方法だと思います:

a = ['hello','1','hi',2,'something','3']

for index,value in enumerate(a):

     if isinstance(value,int):

             a[index] = float(value)

print a

出力は次のとおりです:['こんにちは', '1', 'こんにちは', 2.0, '何か', '3']

于 2012-10-19T11:30:28.063 に答える