【问题标题】:in Python how to convert number to float in a mixed list [duplicate]在Python中如何将数字转换为混合列表中的浮点数[重复]
【发布时间】:2013-01-31 19:33:48
【问题描述】:

我有一个字符串列表,格式如下

a = ['str','5','','4.1']

我想将列表中的所有数字转换为浮点数,但其余保持不变,像这样

a = ['str',5,'',4.1]

我试过了

map(float,a)

但显然它给了我一个错误,因为某些字符串无法转换为浮点数。我也试过了

a[:] = [float(x) for x in a if x.isdigit()]

但它只给了我

[5]

所以浮点数和所有其他字符串都丢失了。我应该怎么做才能同时保留字符串和数字?

【问题讨论】:

  • 对不起,我不是很清楚,列表可能很长,我不知道元素的确切顺序,这意味着我不知道哪个是手头的数字。
  • 您尝试过'4.1'.isdigit(),还是阅读the docs? “如果字符串中的所有字符都是数字,则返回true……”由于'.'不是数字,因此返回false。
  • @abarnert,你是对的。我对 4.1 的看法有误,现在已修复。

标签: python string list


【解决方案1】:
>>> a = ['str','5','','4.1']
>>> a2 = []
>>> for s in a:
...     try:
...         a2.append(float(s))
...     except ValueError:
...         a2.append(s)
>>> a2
['str', 5.0, '', 4.0999999999999996]

如果你在做十进制数学,你可能想看看十进制模块:

>>> import decimal
>>> for s in a:
...     try:
...         a2.append(decimal.Decimal(s))
...     except decimal.InvalidOperation:
...         a2.append(s)
>>> a2
['str', Decimal('5'), '', Decimal('4.1')]

【讨论】:

  • 谢谢。但是为什么我会得到 4.0999999999999996?我希望有与原始数字相同的有效数字。
  • @LWZ - 这就是浮点数的工作方式。见this question
  • @LWZ:因为您不能将4.1 完全表示为float。关于此的 SO 上大约有 69105.00000000000001 个问题,因此请搜索是否需要更多信息。
【解决方案2】:
for i, x in enumerate(a):
    try:
        a[i] = float(x)
    except ValueError:
        pass

这假设您要更改 a,以创建新列表,您可以使用以下内容:

new_a = []
for x in a:
    try:
        new_a.append(float(x))
    except ValueError:
        new_a.append(x)

这种 try/except 方法是标准的EAFP,并且比检查每个字符串是否为有效浮点数更有效且不易出错。

【讨论】:

  • 单行示例将在4.1 上失败,因为点字符不是数字。用if i.replace('.','').isdigit() 替换if i.isdigit() 应该可以解决这个问题。
  • 是的,我刚刚意识到,我只是删除了一个衬里,因为您还会遇到负数和科学记数法的问题。更容易只做 try/except。
【解决方案3】:

这是一种无需异常处理并使用一点正则表达式的方法:-

>>> a = ['str','5','','4.1']
>>> import re
>>> [float(x) if re.match("[+-]?(?:\d+(?:\.\d+)?|\.\d+)$", x) else x for x in a]
4: ['str', 5.0, '', 4.1]

请注意,此正则表达式仅涵盖适用于您的情况的基本数字范围。要获得更精细的正则表达式以匹配更广泛的浮点数,例如,包括指数,您可以看看这个问题:-

【讨论】:

  • 是否值得在re "\d+(\.\d+)?$" 中使用$ 锚定'3.14pi' 等病理情况。最佳答案。
  • 您的解决方案遗漏了负数,不是吗?总而言之,除非真的需要,否则使用正则表达式几乎不是一个好主意。
  • @Vladimir .. 是的,更新了。根据 OP 的输入,没有首先考虑所有案例。
  • 另外,.51. 在 python 中仍然是有效的浮点字面量;)
  • 看来,正确的正则表达式已经出现在stackoverflow.com/questions/385558/…
【解决方案4】:

我的版本:

def convert(value):
    try:
        return float(value)
    except ValueError:
        return value

map(convert, a)

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多