【问题标题】:How can I sum values in a list? [duplicate]如何对列表中的值求和? [复制]
【发布时间】:2014-03-03 17:14:10
【问题描述】:

我的代码:

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 文件并将其附加到距离列表中。我如何对它们求和,以便获得总距离?我已经尝试了网站上给出的一些答案,但它们没有奏效:(

【问题讨论】:

    标签: python list sum


    【解决方案1】:

    在使用内置的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    
    

    【讨论】:

    • 从技术上讲,这是一个生成器表达式,因为没有像 sum([float(e) for e in distance]) 那样创建列表。
    【解决方案2】:

    将每个元素转换为浮点数并使用 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']
    
    distance = [float(s) for s in distance]
    total = sum(distance)
    
    total
    >>> 2.9199999999999986
    

    要处理多余的 9,请使用 Decimal。

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

    【讨论】:

      【解决方案3】:

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

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

      那些 9 是由于浮点数固有的不精确性。如果你想要精确的东西,你可以使用Decimal

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

      【讨论】:

      • 生成器表达式可能被认为更像 Pythonic:sum( float(x) for x in distance).
      • @chepner:为什么?你会用生成器替换所有map 的使用吗? (itertools.imap 也会返回一个生成器,因此也消除了 map 返回列表的创建)
      • 您可以使用math.fsum 而不是sum 以获得更准确的结果。
      • 使用map(或imap)效率更高,因为您对结果列表感兴趣。另请参阅我在 this question 上的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多