2013-02-25 103 views
1

我想弄清楚一个问题,我感到困惑。基本上我有一个清单,它应该代表银行对账单。我试图将这个列表加在一起,所以负数应该代表withdrawl,加在一起,正数加在一起表示存款。到目前为止,我如何将列表添加到一起

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]有人可以帮忙吗?

谢谢!

回答

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 == -x。你想要if b < 0:


我检查其答案是CPython的3.3更快,勿庸置疑这一个是上给定的例子快约2倍:2.3 us per loop VS 5.98 us per loop

+0

不错的答案列弗。 – 2013-02-25 07:53:04

+0

这样做的好处是它只能让一次通过序列。我对这个答案进行了计时,并用两个对sum()进行的调用来回答,这个答案更快。 – steveha 2013-02-25 07:53:49

+0

@steveha当编辑显示时,它也位于CPython上。 – 2013-02-25 07:58:42

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永远不会被覆写(这也说明你有结果) 。

+0

很好的答案,解释他的错误也 – 2013-02-25 07:52:34

+1

这很好,但不会与迭代器一起工作,比使用列表慢2倍左右。在这种情况下可能不是问题。 – 2013-02-25 07:52:55

+0

也不应该使用它作为参数,因为它可以很容易地与1. – 2013-02-25 07:54:26