Python - How to convert only numbers in a mixed list into float?

后端 未结 4 1599
不思量自难忘°
不思量自难忘° 2020-12-06 23:47

I\'m trying to learn Python and i have a problem, so if i have something like that:

data_l = [\'data\', \'18.8\', \'17.9\', \'0.0\']

How d

相关标签:
4条回答
  • 2020-12-06 23:59

    Universal approach:

    def validate_number(s):
        try:
            return float(s)
        except (ValueError, TypeError):
            return s
    
    data = [validate_number(s) for s in data]
    

    In case the structure is fixed:

    data = [s if i == 0 else float(s) for i, s in enumerate(data)]
    

    Another one:

    data = [data[0]] + [float(s) for s in data[1:]]
    

    isdigit would work in case of positive integers:

    data = [int(s) if s.isdigit() else s for s in data]
    
    0 讨论(0)
  • 2020-12-07 00:00

    You can use the str.isdigit method and a list comprehension:

    list = [int(s) if s.isdigit() else s for s in list]
    

    Here you have a live example

    0 讨论(0)
  • 2020-12-07 00:04

    You could create a simple utility function that either converts the given value to a float if possible, or returns it as is:

    def maybe_float(s):
        try:
            return float(s)
        except (ValueError, TypeError):
            return s
    
    orig_list = ['data', '18', '17', '0']
    the_list = [maybe_float(v) for v in orig_list]
    

    And please don't use names of builtin functions and types such as list etc. as variable names.


    Since your data actually has structure instead of being a truly mixed list of strings and numbers, it seems a 4-tuple of (str, float, float, float) is more apt:

    data_conv = (data_l[0], *(float(v) for v in data_l[1:]))
    

    or in older Python versions

    # You could also just convert each float separately since there are so few
    data_conv = tuple([data_l[0]] + [float(v) for v in data_l[1:]]) 
    
    0 讨论(0)
  • 2020-12-07 00:04

    The above-mentioned approaches are working but since a mixed list can also contain an integer value I added an extra checking.

    def validate(num):
        try:
            return int(num)
        except (ValueError, TypeError):
            try:
                return float(num)
            except (ValueError, TypeError):
                return num
    
    
    vals_ = ['cat' ,'s-3-f','7390.19','12']
    new_list = [validate(v) for v in vals_]  
    

    Output:

    ['cat', 's-3-f', 7390.1, 12]
    
    0 讨论(0)
提交回复
热议问题