Python将列表上的二维字符串转换为浮点数

时间:2018-10-29 17:53:46

标签: python

我有一个学校项目,其中我需要制作一个二维列表并计算该列表上的平均点数。由于某种原因,我无法将列表中的值更改为浮点数,甚至认为它会使用print(pointslist [0] [1])将它们打印为单个值。

def read_points():

print("Input the points, one per line as x,y.")
print("Stop by entering an empty line.")
arvo = 0
pointslist = []
while arvo != "":
    arvo = input("")
    kordinaatti = arvo.split(",")
    pointslist.append(kordinaatti)

return pointslist   

def calculate_midpoint(pointslist):

h = len(pointslist)
j = int(0)
summax = 0
summay = 0
while j <= h:
    arvox = pointslist[j][0]
    arvoy = pointslist[j][1]
    summax += float(arvox)
    summay += float(arvoy)
    summax = float(summax / h)
    summay = float(summay / h)
    j += 1       
return summax, summay

给出错误:

summax += float(arvox)

ValueError: could not convert string to float: ¨

格式略有偏离,但在代码上正确无误。

谢谢:)现在我看到了问题,但是我仍然对这部分代码有问题:

def calculate_midpoint(pointslist):

h = len(pointslist)
j = 0
summax = 0
summay = 0
while j <= h:
    arvox = float(pointslist[j][0])
    arvoy = float(pointslist[j][1])
    summax += float(arvox)
    summay += float(arvoy)
    summax = float(summax / h)
    summay = float(summay / h)
    j += 1       
return summax, summay

超出索引。例如,当我插入0而不是J时,代码可以正常工作。由于J会使程序崩溃,J得到什么值?

感谢大家的帮助,问题已经解决!

3 个答案:

答案 0 :(得分:1)

您的read_points()返回的值是空白字符串,float无法执行任何操作。

如果我执行read_points()并输入'5','4','3',则会返回[['5'], ['4'], ['3'], ['']],尝试执行float('')时,该列表中的最后一项将引发错误。因此,您需要在read_points()中对其进行修复以仅返回输入的而不是空白行,或者在第二个函数中处理非整数。

因此,代码的替代方案可能是:

def read_points():

    print("Input the points, one per line as x,y.")
    print("Stop by entering an empty line.")
    arvo = 0
    pointslist = []
    while arvo != "":
        arvo = input("")
        kordinaatti = arvo.split(",")
        pointslist.append(kordinaatti)

    return pointslist[:-1]   

def calculate_midpoint(pointslist):

    h = len(pointslist)-1
    j = int(0)
    summax = 0
    summay = 0
    while j <= h:
        arvox = pointslist[j][0]
        arvoy = pointslist[j][0]
        summax += float(arvox)
        summay += float(arvoy)
        summax = float(summax / h)
        summay = float(summay / h)
        j += 1       
    return summax, summay

答案 1 :(得分:0)

不管格式问题,您的基础代码中都有两个错误:

read_points中的围栏问题

read_points在读取空行后终止,但它将此空行附加到pointslist,这意味着pointslist中的最后一项无效。解决此问题的方法有很多:一种简单的方法是在每次迭代的末尾而不是开始时进行阅读:

def read_points():
    print("Input the points, one per line as x,y.")
    print("Stop by entering an empty line.")
    arvo = 0
    pointslist = []
    arvo = input("")
    while arvo != "":
        kordinaatti = arvo.split(",")
        print(kordinaatti)
        pointslist.append(kordinaatti)
        arvo = input("")

    return pointslist

这是“无法将字符串转换为浮点数”问题的原因,因为最后一点不是有效点。

calculate_midpoint中的一对一发行

您的代码从j=0迭代到j=len(pointslist),并在每次迭代时尝试访问pointslist[j]。这会尝试读取len(pointslist) + 1个项目,这是不正确的;您最多只能阅读j=len(pointslist) - 1。这是造成您在操作说明中提到的索引错误的原因。

固定版本:

def calculate_midpoint(pointslist):
    print(pointslist)
    h = len(pointslist)
    j = int(0)
    summax = 0
    summay = 0
    while j < h:
        arvox = pointslist[j][0]
        arvoy = pointslist[j][0]
        summax += float(arvox)
        summay += float(arvoy)
        summax = float(summax / h)
        summay = float(summay / h)
        j += 1
    return summax, summay

答案 2 :(得分:0)

这是一个好的开始,但是您的代码中有两个错误。

第一个错误是正在读取输入的代码试图将空行视为浮点数。

第二个错误是计算中点的代码试图通过在比较中使用less thanequal to来处理列表末尾的点。

我重新整理了您的代码,以使其在下面正常工作。

def read_2d_points():
    '''
    Read 2D points from the command line.
    '''
    print("Input the points, one per line as x,y.")
    print("Stop by entering an empty line.")
    arvo = 0
    pointslist = []
    while arvo != "":
        arvo = input("? ")
        if ',' in arvo:
            # Ignore the case where the line is empty
            # to avoid a float conversion error.
            kordinaatti = [float(x.strip()) for x in arvo.split(",")]
            assert len(kordinaatti) == 2  # assume 2D
            pointslist.append(kordinaatti)
    assert len(pointslist) > 1
    return pointslist   


def calculate_midpoint(pointslist):
    '''
    Calculate the mid point.
    '''
    h = len(pointslist)
    j = int(0)
    summax = 0
    summay = 0
    while j < h:
        arvox = pointslist[j][0]
        arvoy = pointslist[j][1]
        summax += float(arvox)
        summay += float(arvoy)
        summax = float(summax / h)
        summay = float(summay / h)
        j += 1       
    return summax, summay

pointsList = read_2d_points()
print('points: {} {}'.format(len(pointsList), pointsList))
print('midpoint: {}'.format(calculate_midpoint(pointsList)))

如果您对扩展python知识感兴趣,我建议考虑考虑使用classesnamedtuples并考虑使用使用列表推导。

好运。