次のようなリストがあるとします。
a = ['hello','1','hi',2,'something','3']
文字列を保持したまま、リスト内の数値を float に変換したい。
私はこれを書きました:
for i in a:
try:
i = float(i)
except ValueError:
pass
これを行うためのより効率的できちんとした方法はありますか?
次のようなリストがあるとします。
a = ['hello','1','hi',2,'something','3']
文字列を保持したまま、リスト内の数値を float に変換したい。
私はこれを書きました:
for i in a:
try:
i = float(i)
except ValueError:
pass
これを行うためのより効率的できちんとした方法はありますか?
すでに試したことに基づいて:
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
等しく設定します。
変数の値を変更していますi
-> 配列の内容はa
変更されません! 配列の値を変更したい場合は、次のように実装する必要があります。
for index, value in enumerate(a):
try :
a[index] = float(value)
except ValueError :
pass
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]
私の短い例はどうですか:
a = ['hello','1','hi',2,'something','3']
for i, item in enumerate(a):
if str(item).isdigit():
a[i] = float(item)
print a
これは短くて良い方法だと思います:
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']