【问题标题】:Python - How to convert only numbers in a mixed list into float?Python - 如何仅将混合列表中的数字转换为浮点数?
【发布时间】:2018-02-07 22:47:14
【问题描述】:

我正在尝试学习 Python,但遇到了问题,所以如果我有类似的问题:

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

我是怎么做到的?

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

【问题讨论】:

  • 你已经做到了。将名称分配给新列表。没有?
  • 这些是整数,不是浮点数。
  • 你知道,已编辑
  • 格式总是一样的吗? [str, float, float, float]?
  • 它可以是 [str, float, float, float] 或 [str, int, int, float] 或 [str, float, float, int]

标签: python python-3.x list dictionary


【解决方案1】:

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

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

【讨论】:

  • 请注意,您的其他 cmets 表明您有一个 XY problem,通过询问“解决方案”来隐藏实际问题。由于您的数据实际上看起来更像 (str, number, number, number) 的元组,因此您不需要此答案中提供的这种解决方案,而只需要 (data_l[0], *[float(v) for v in data_l[1:]])(在足够近的 Python 版本中)。
  • 是的,我很抱歉,下次我会注意的,谢谢:)
【解决方案2】:

您可以使用str.isdigit 方法和列表推导:

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

你有一个live example

【讨论】:

  • 如果它们真的是花车呢?例如1.5
【解决方案3】:

通用方法:

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]

【讨论】:

  • 您的第二个版本仍然只适用于整数。编辑:你的编辑比我的评论快
  • 那是我的 sry
【解决方案4】:

上述方法有效,但由于混合列表也可以包含整数值,因此我添加了额外的检查。

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2021-02-26
    • 2018-09-25
    • 2013-10-20
    • 1970-01-01
    • 2011-04-04
    • 2019-03-31
    相关资源
    最近更新 更多