如何对列表中的值求和?

时间:2014-02-06 16:20:51

标签: python list sum

我的代码:

distance = ['0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.01', '0.13', '0.02', '0.12', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.01', '0.13', '0.02', '0.13', '0.01']

值来自CSV文件并将其附加到距离列表。如何将它们相加以便我可以获得总距离?我已经尝试了网站上给出的一些答案,但它们没有奏效:(

3 个答案:

答案 0 :(得分:5)

使用map将字符串转换为浮点数,然后将结果数字与sum相加。

>>> sum(map(float, distance))
2.9199999999999986

这些9是由于浮子固有的不精确。如果您想要精确的内容,可以使用Decimal

>>> from decimal import Decimal
>>> sum(map(Decimal, distance))
Decimal('2.92')

答案 1 :(得分:4)

将每个元素转换为float并使用sum builtin:

distance = ['0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.01', '0.13', '0.02', '0.12', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.01', '0.13', '0.02', '0.13', '0.01']

distance = [float(s) for s in distance]
total = sum(distance)

total
>>> 2.9199999999999986

要照顾额外的9,请使用十进制。

from decimal import Decimal

distance = [Decimal(s) for s in distance]
total = sum(distance)
total
>>>Decimal('2.92')

答案 2 :(得分:3)

在使用内置sum之前,您需要将字符串值转换为浮点数。

这不起作用:

>>> sum(['1', '2'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

但这样做:

>>> sum([1,2])
3

因此,您需要逐步浏览列表distance的每个值,并在将列表移至sum之前转换为浮点数。

您可以使用列表推导,映射,循环或生成器表达式:

>>> distance = ['0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.01', '0.13', '0.02', '0.12', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.12', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.02', '0.13', '0.01', '0.13', '0.02', '0.13', '0.01']
>>> sum(float(e) for e in distance)
2.9199999999999986

要获得更准确的结果,请使用fsum

>>> math.fsum(float(e) for e in distance)
2.92