python-3.x 如何只将混合列表中的数字转换为float

mwg9r5ms  于 2023-06-25  发布在  Python
关注(0)|答案(4)|浏览(103)

我正在学习Python,我遇到了一个问题,所以如果我有这样的东西:

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

我该怎么做呢?

data_l = ['data', 18.8, 18.9, 0.0]
ws51t4hk

ws51t4hk1#

你可以创建一个简单的实用函数,如果可能的话,将给定的值转换为浮点数,或者按原样返回:

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]

请不要使用内置函数和类型的名称,如list等。作为变量名。
由于你的数据实际上具有结构,而不是真正的字符串和数字的混合列表,所以(str, float, float, float)的4元组似乎更合适:

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

或在较旧的Python版本中

# 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:]])
kse8i1jr

kse8i1jr2#

你可以使用str.isdigit方法和列表解析:

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

这里有一个live example

nom7f22z

nom7f22z3#

通用方法:

def validate_number(s):
    try:
        return float(s)
    except (ValueError, TypeError):
        return s

data = [validate_number(s) for s in data]

如果结构是固定的:

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

另一个:

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

isdigit将在正整数的情况下工作:

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

e0bqpujr4#

上面提到的方法是有效的,但是由于混合列表也可以包含整数值,所以我增加了一个额外的检查。

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

输出:

['cat', 's-3-f', 7390.1, 12]

相关问题