Python re.findall float return无法求和返回的值

时间:2016-07-17 11:03:53

标签: python floating-point sum string-conversion

我正在使用re.findall从文件中的特定行返回浮点数:

mealReturnValue = re.findall("\d+\.\d+",lines[2])

它从中拉出的示例文件行:“总帐单是400.00”

这将返回一个数字列表,如下所示:

[['400.00'], ['210.0'], ['400.00']]

我正在尝试对列表求和,但是,它会引发以下错误:

Traceback (most recent call last):
  File "TotalSpend.py", line 25, in <module>
    totalSpend = sum(mealReturn)
TypeError: unsupported operand type(s) for +: 'int' and 'list'

这似乎是re.findall的一个功能,因为我已经能够通过生成相同数字的数组手动执行此操作。

例如:

i = [400.00, 210.0, 400.00]

print sum(i)

所以我不知道这里真正的问题是什么,我似乎无法将re.findall转换为我可以在列表中使用的浮点数。

非常感谢任何帮助。

为了更清晰整个代码文件:

import os
import sys
import re


dirListing = os.listdir('C:\Users\joshnathan\Desktop\LPTHW')
mealReturn =[] # Array of returned meal values
numberOfMeals = 0

print "Which meal do you want to calculate?"
meal = raw_input(">>")


for item in dirListing:
    if meal in item:
        numberOfMeals += 1
        fileName = open(item, 'r')
        lines = fileName.readlines()
        mealReturnValue = re.findall('\d+\.\d+',lines[2])
        mealReturn.append(mealReturnValue)
        print mealReturn


print numberOfMeals
totalSpend = sum(mealReturn)
print totalSpend

由于 约书亚

2 个答案:

答案 0 :(得分:0)

试试这个。

In [1]: sum([float(i[0]) for i in a])
Out[1]: 1010.0

a视为您的结果。您正尝试在列表列表上执行sum操作。它是字符串格式。您需要转换为float并将其作为单个列表。然后,您可以执行sum操作。

<强>步骤

1。将其作为单个列表

In [2]: [i[0] for i in a]
Out[2]: ['400.00', '210.0', '400.00']

2。将所有元素转换为float

In [3]: [float(i[0]) for i in a]
Out[3]: [400.0, 210.0, 400.0]

3。执行总和操作。

In [4]: sum([float(i[0]) for i in a])
Out[4]: 1010.0

修改

mealReturnValue = re.findall('\d+\.\d+',lines[2])会返回类似[['400.00']]的内容,因此您可以像mealReturnValue = float(re.findall('\d+\.\d+',lines[2])[0])一样将其转换为float。而不是append到一个字符串,你可以添加一个变量。 mealReturnValue += re.findall('\d+\.\d+',lines[2])。要像这样使用,你必须声明mealReturnValue。像这样mealReturnValue = 0

像这样改变你的代码

totalSpend = 0
for item in dirListing:
    if meal in item:
        numberOfMeals += 1
        fileName = open(item, 'r')
        lines = fileName.readlines()
        totalSpend += float(re.findall('\d+\.\d+',lines[2])[0])

print numberOfMeals
print totalSpend

答案 1 :(得分:0)

您正在尝试汇总字符串列表。

求和时,应将值相加为浮点数:

sum(float(num[0]) for num in mealReturnValue)
>> 1010.0