次のような入力リストが[2,3,4,"5cm", 6,"2.5km"]
あり、結果が必要です。
[2,3,4,5,6,2.5]
こんな感じで始めたいと思います
for element in inputList:
regex
:を使用しないソリューションを次に示します。
my_list = [2,3,4,"5cm", 6,"2.5km"]
def get_digits(s):
return ''.join(ele for ele in s if not ele.isalpha())
def convert_to_nums(my_list):
result = []
for ele in my_list:
if isinstance(ele, (int, float)):
result.append(ele)
else:
ele = get_digits(ele)
try:
result.append(int(ele))
except ValueError:
result.append(float(ele))
return result
結果:
>>> convert_to_nums(my_list)
[2, 3, 4, 5, 6, 2.5]
まず、正規表現を使用します。これは、この仕事に適したツールです。次に、既知の要件を満たす最も単純なソリューションを使用します。具体的には、文字列の末尾から数字以外を削除するために使用できる正規表現です。
import re
vals = [2, 3, 4, "5cm", 6, "2.5km"]
rgx = re.compile(r'\D+$')
nums = [float( rgx.sub('', str(v)) ) for v in vals]
print nums
また、本当に正規表現を避ける必要がある場合は、例外処理、型チェック、または最も単純な より複雑なロジックに頼らずにそれを行う方法を次に示しif-else
ます。
def leading_digits(v):
for c in str(v):
if c in '0123456789.': yield c
else: return
def intfloat(s):
f = float(s)
i = int(f)
return i if i == f else f
vals = [2, 3, 4, "5cm", 6, "2.5km", '8.77cm extra junk w/ digits 44']
nums = [intfloat(''.join(leading_digits(v))) for v in vals]
print nums # [2, 3, 4, 5, 6, 2.5, 8.77]