2013-02-25 149 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