我正在试图找出一个问题而且我感到很困惑。基本上我有一个清单,它应该代表银行对账单。我正在尝试将列表添加到一起,因此将应该代表撤销的负数加在一起,并将正数加在一起以表示存款。到目前为止,我得到了
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]
,有人可以帮忙吗?
谢谢!
答案 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
永远不会被覆盖(这解释了你得到的结果)。