如何一起添加列表

时间:2013-02-25 07:46:24

标签: python

我正在试图找出一个问题而且我感到很困惑。基本上我有一个清单,它应该代表银行对账单。我正在尝试将列表添加到一起,因此将应该代表撤销的负数加在一起,并将正数加在一起以表示存款。到目前为止,我得到了

def statement(l):
    deposit = 0
    withdrawl = 0
    for a in l:
        a = sum(l)
    for b in l:
        if b == -b:
            b = sum(b)        
    return [a,-b]

但当我做statement([30.95,-15.67,45.56,-55.00,43.78])时 它返回[49.620000000000005, -43.78] 如果它应该返回[120.29,-70.67],有人可以帮忙吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

以下似乎是这样做的:

In [1]: def statement(l):
   ...:     pos, neg = 0, 0
   ...:     for a in l:
   ...:         if a > 0: pos += a
   ...:         else: neg += a
   ...:     return pos, neg
   ...: 

In [2]: statement([30.95,-15.67,45.56,-55.00,43.78])
Out[2]: (120.29, -70.67)

它返回tuple而不是list,这似乎更合乎逻辑,因为长度是固定的。


以下是对您尝试的一些评论:

for a in l:
    a = sum(l)

这将导致l的所有元素的总和被计算len(l)次,这没有多大意义。要获得总和,只需执行一次a = sum(l)

if b == -b: - 你可能希望这可以检查一个数字是否为负,但实际上它会检查b是否等于零,因为零是唯一的x所以{{1 }}。你想要x == -x


我在CPython 3.3上检查了哪个答案更快,不出所料,这个答案在给定的示例上快了约2倍:if b < 0: vs 2.3 us per loop

答案 1 :(得分:4)

这应该做你想要的:

def statement(l):
    pos = sum(i for i in l if i > 0)
    neg = sum(i for i in l if i < 0)
    return pos, neg

您的错误是您尝试分配给迭代变量。如果要累积值,请先在for循环之外将其定义为0,然后在每个步骤中添加到该值。

在循环结束时,a包含l中所有元素的总和,b包含l中的最后一个元素,因为最终检查总是失败,b永远不会被覆盖(这解释了你得到的结果)。