将字符串列表转换为浮点列表,然后求和

时间:2019-04-26 21:21:07

标签: python

我刚开始使用python,请需要您的帮助。 我有一个包含13列的文本文件,在13列中,我有71.78 , 84.44 , 58.68等数字。

我选择该列并将其转换为列表:

['71.78', '84.44', '58.68', '70.15', '58.39']

之后,我尝试转换为float以求和,但没有成功。

这是我的代码:

import csv
with open('cust.txt', 'r') as file: 
    file.readline()
    prices = [cols[13] for cols in csv.reader(file, delimiter="\t")]
    prices_list = (str(prices))
    floats = [float(x) for x in prices_list.split(" ")]
    print(sum(str(floats)))

谢谢你,我会很高兴。

更新:我的错误是: ValueError:无法将字符串转换为float:“ ['98 .14',”

3 个答案:

答案 0 :(得分:0)

这应该有效。

prices = ['71.78', '84.44', '58.68', '70.15', '58.39']
floats = [float(x) for x in list]
print(sum(floats))

编辑:这是读取csv的另一种方法。

with open('cust.txt', 'r') as csvfile:
    prices = [cols[1] for cols in csv.reader(csvfile, delimiter="\t")]
    floats = [float(x) for x in prices]
    print(sum(floats))

要直接获取浮动价格列表,请在构建价格列表时直接投射。

with open('cust.txt', 'r', newline='') as csvfile:
    prices = [float(cols[1]) for cols in csv.reader(csvfile, delimiter=",")]
    print(sum(prices))

答案 1 :(得分:0)

您只需要以下代码即可实现所需的功能:

floats = [float(x) for x in prices_list]
print(sum(floats))

答案 2 :(得分:0)

您的代码有两个问题:

  1. 如果CSV文件有13列,则最后一列是cols[12]而不是cols[13]
  2. 使用prices_list = (str(prices))将整个列表转换为一个字符串(实际上是仅包含该字符串的元组)。在下一条语句中,您将使用空格作为分隔符来拆分此字符串,但这不会删除其他字符,例如方括号,引号和逗号。这就是为什么向float转换失败的原因。

它有助于打印中间结果(或使用调试器),以查看程序在做什么并确定问题出在哪里。

以下代码是一个有效的示例,假设您的CSV数据是制表符分隔的,有13列,最后一列包含您感兴趣的浮点数据。 由于没有您的CSV文件,因此我将StringIO对象与测试数据一起使用。 StringIO的行为就像文件一样,因此代码应与CSV文件相同。

#!/usr/bin/env python3

import csv
import io  # just for the test data since I don't have the CSV file

TEST_DATA = """
a\tb\tc\td\te\tf\tg\th\ti\tj\tk\tl\t71.78
a\tb\tc\td\te\tf\tg\th\ti\tj\tk\tl\t84.44
a\tb\tc\td\te\tf\tg\th\ti\tj\tk\tl\t58.68
"""

print(TEST_DATA)

#with open('cust.txt', 'r') as file:
with io.StringIO(TEST_DATA) as file:
    file.readline()
    prices_as_str = [cols[12] for cols in csv.reader(file, delimiter="\t")]
    print('prices_as_str: ' + repr(prices_as_str))
    prices_as_float = [float(x) for x in prices_as_str]
    # Alternatively you could use map():
    # prices_as_float = list(map(float, prices_as_str))
    print('prices_as_float: ' + repr(prices_as_float))
    print('sum: ' + repr(sum(prices_as_float)))

其输出如下(制表符减少为6个字符以减小行宽):


a     b     c     d     e     f     g     h     i     j     k     l     71.78
a     b     c     d     e     f     g     h     i     j     k     l     84.44
a     b     c     d     e     f     g     h     i     j     k     l     58.68

prices_as_str: ['71.78', '84.44', '58.68']
prices_as_float: [71.78, 84.44, 58.68]
sum: 214.9