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