1

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

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]

谢谢!

4

2 回答 2

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)

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


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

for a in l:
    a = sum(l)

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

if b == -b:- 你可能希望它检查一个数字是否为负,但实际上它检查是否b等于零,因为零是唯一xx == -x。你想要if b < 0:


我检查了哪个答案在 CPython 3.3 上更快,不出所料,这个答案在给出的示例中大约快 2 倍:2.3 us per loopvs 5.98 us per loop.

于 2013-02-25T07:49:52.140 回答
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永远不会被覆盖(这解释了你得到的结果)。

于 2013-02-25T07:51:28.197 回答