如何相加列表

1 投票
2 回答
818 浏览
提问于 2025-04-17 17:01

我在弄一个问题的时候有点困惑。简单来说,我有一个列表,这个列表是用来表示银行对账单的。我想把这个列表里的数字加起来,负数代表取款,所以要把负数加在一起,正数代表存款,要把正数加在一起。到目前为止,我得到了

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 个回答

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的值不会被覆盖(这就是你得到的结果的原因)。

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 == -x。你应该用 if b < 0: 来检查。


我检查了在 CPython 3.3 上哪个答案更快,结果不出所料,这个答案在给定的例子中大约快了 2 倍:每次循环 2.3 微秒 对比 每次循环 5.98 微秒

撰写回答