2012-10-19 9 views
5

フロート私はこのようなリストを持っていると言う:変換リストと

​​

私は、文字列を保持したままフロートに、リスト内の数字を変換したいです。

私はこれを書いた:

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

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

+5

数字は常に同じ場所にありますか? –

答えて

1

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

すでに試した何に基づいて
for index, value in enumerate(a): 
    try : 
     a[index] = float(value) 
    except ValueError : 
     pass 
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と同じ値を設定します。

1

方法を除いて試してみるには、/それをやっての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] 
+1

正規表現? –

+1

@JoelCornett Haha、私はOPがこれをやってみることを好きではないと思ったので、もしかしたら彼がもっと良いかもしれない。 –

0

私の短い例について何:

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

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

print a 
+1

それは '' 1.0 ''で壊れます。 OPがそれらのいずれかを持つことを計画しているかどうかは分かりませんが。 –

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']

関連する問題