1

次のような入力リストが[2,3,4,"5cm", 6,"2.5km"]あり、結果が必要です。

[2,3,4,5,6,2.5]

こんな感じで始めたいと思います

for element in inputList:
4

6 に答える 6

1

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]
于 2013-06-16T17:25:20.123 に答える
1

まず、正規表現を使用します。これは、この仕事に適したツールです。次に、既知の要件を満たす最も単純なソリューションを使用します。具体的には、文字列の末尾から数字以外を削除するために使用できる正規表現です。

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]
于 2013-06-16T17:56:42.737 に答える