【问题标题】:ValueError: could not convert string to float: '30,'ValueError:无法将字符串转换为浮点数:'30,'
【发布时间】:2019-07-14 05:24:52
【问题描述】:

这是我在堆栈溢出中的第一篇文章。

我在为大学做练习时遇到错误,我很想得到一些帮助,因为我是 python 新手,但我有一些编程知识(使用 c#),所以我发现用这种新语言编写代码非常困难。

我以这个数组为例:30、20、10、15、20、34、23、12、23、34、30、15、51 这些是我需要输出的数字:〜[7.4]
但每次我插入它时都会出现代码错误:ValueError:无法将字符串转换为浮点数:'30,'。

没有任何错误(我认为)所以我不知道如何解决这个问题。

提前感谢您的帮助。

import sys 


def floats_println_bracket(a):
print("[", end='')
if (len(a) > 0):
    print("%g" % a[0], end='')
    for i in range(1, len(a) ):
        print(" %g" % a[i], end='')
print("]")


def rewards(a):
global trimmedvalue 
temp = []
for i in len(a):
    if i//3 == 0:
       comission = temp.append(i) 
       total = a[i - 1] + a[i - 2] + [i - 3]        
    if total > 60:        
        comissionvalue = trimmedvalue
        comissionvalue = trimmedvalue + (total * 0.05)
        comission.append(comissionvalue)            
    return comission



def test_rewards():
while True:
    a = []
    try:
        line = input().split()
    except (EOFError, KeyboardInterrupt):
            sys.exit(0)
    if line:
        for i in line:
            a.append(float(i))
    z = rewards(a)
    floats_println_bracket(z)

if __name__ == '__main__':
test_rewards()

【问题讨论】:

  • 你有一个字符串数组?错误告诉你它得到了30,。它有一个, 字符,不能转换为floats 或numbers :)。您应该做的是对您阅读的内容进行消毒。请显示您的输入文件:)
  • 哦,天哪,完全没有引起我的注意 ahahaha 我真的很抱歉这个帖子大家......每一行上的“,”的原因是因为我做了同样的练习c# 有一个数组,忘记删除逗号。但仍然无法在 python 中完成它并且仍然出现一些错误谢谢大家!

标签: python arrays type-conversion


【解决方案1】:

你的错误是“ValueError: could not convert string to float: '30,'。”

你必须去掉 ',' 例如: 假设您总是想摆脱最后一个字符:

your_almost_number = '30,'
your_number = float(your_almost_number[:-1])

仅包含 ',' 的情况:

your_almost_number = '30,'
your_number = float(your_almost_number.split(',')[0])

【讨论】:

  • 似乎在他们已经使用的 split 命令中去掉, 会更容易。
  • 当然可以,但是如果问题在于删除类似数字的字符串的最后一个字符,那么 split() 将不是最佳选择。
  • 这可能适用于您的示例,但要获得更通用的解决方案,应该在 , 上拆分。例如,如果输入是'30 ,',您的代码将失败
  • 已编辑 - 添加大小写为 ', '
【解决方案2】:

虽然丑,但操作速度很快,可以覆盖很多情况。

a.append(float(i.replace(",", "").strip()))

用于:

while True:
    a = []
    try:
        line = input().split()
    except (EOFError, KeyboardInterrupt):
            sys.exit(0)
    if line:
        for i in line:
            a.append(float(i.replace(",", "").strip()))
    z = rewards(a)
    floats_println_bracket(z)

【讨论】:

    【解决方案3】:

    您可以使用map 来转换数字列表

    test_string = "30, 20, 10, 15, 20, 34, 23, 12, 23, 34, 30, 15, 51"
    map(float,test_string.split(','))
    

    还假设您有多个值要拆分

    import string
    import re
    test_string = "30| 20, 10* 15, 20, 34@ 23, 12, 23, 34, 30, 15, 51"
    map(float,re.split('['+'|'.join(string.punctuation)+']',test_string))
    

    输出

    [30.0, 20.0, 10.0, 15.0, 20.0, 34.0, 23.0, 12.0, 23.0, 34.0, 30.0, 15.0, 51.0]
    

    注意:在 Python3 中,您可能必须将最终输出转换为 list

    【讨论】:

    • 我很少这么说,但你的回复似乎不起作用,我只是不断收到ValueError: could not convert string to float
    • @tgikal 我看不出它失败的原因。您是否尝试执行整个 sn-p 代码?
    • 我应该提到我在 Python 3 上。是的,我运行的正是你所拥有的,没有返回,在 map 操作周围添加 list 会给出值错误。
    • @tgikal 我不知道为什么会这样。 re 模块的行为有点奇怪,但在这种情况下会引发不同的错误。这是使用正则表达式模块repl.it/repls/LavishAnnualBaitware在Python3中成功执行的代码
    • 是的......很奇怪,正则表达式适用于该版本的 3.6.1,但不适用于我的 3.7.0。
    【解决方案4】:

    根据输入中的','或', '进行拆分

     line = input().split(',')
    

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 2019-03-23
      • 2018-06-13
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多