2013-09-28 62 views
0

我在Python中創建了一個程序,如果ab元素的數量相等,則返回布爾值True,否則返回False。每次運行這個時,我都會得到一個「真」輸出,而不是「假」。有人可以用我的代碼找出問題嗎?如何將我的堆棧項目傳遞給一個函數?

def equal(s): 
    s = Stack() 
    stack_a = Stack() 
    stack_b = Stack() 
    while not s.is_empty(): 
     if s.top() == 'a': 
      var = s.pop() 
      push(stack_a, var) 
     else: 
      var = s.pop() 
      push(stack_b, var) 
    if stack_a.size() == stack_b.size(): 
     return True 
    else: 
     return False 

my_list = ['a', 'a', 'a', 'b'] 
print equal(my_list) 
+0

PEP8是你的朋友:http://www.python.org/dev/peps/pep-0008/。 –

+0

什麼是「堆棧」? – Veedrac

+0

我不明白爲什麼它不應該是https://en.wikipedia.org/wiki/Stack_(abstract_data_type) –

回答

2

假設你Stack類是堆容器的一些有效的實施,似乎你正在創建

S = Stack() 

也許你想使用類似

S = Stack(S) 

因此,檢查是否有相同數量的'a's和'b總是返回True(如StackA.size() == 0StackB.size() == 0

而且,更容易的辦法是做

def equal(S): 
    return len([x for x in S if x=='a']) == len([x for x in S if x=='b']) 

或(由Erik Allik的建議)

def equal(S): 
    return sum(1 for x in S if x=='a') == sum(1 for x in S if x=='b') 
+0

'return sum(1 for x in S if x =='a')== ...'也會稍微更高效:) –

2

equal函數採用名爲S參數,但那麼就在函數的開始處,您將重寫傳入函數的S的內容,並使用新創建的空棧:S = Stack(),不要刪除那條線,並且你有一個更少的錯誤。我認爲這是公平的,建議你的push()函數,無論你定義它,應該是一個Stack類的方法;否則將堆棧定義爲一個類並沒有意義,但不能將所有緊密堆棧相關的操作以方法的形式放入該類中。

+0

有趣的是,對於大多數帶有OOP功能的語言(包括Python),'X.methodA (...)'或多或少是'methodA(X,...)'的語法糖。但是,是的,實際製作這些方法會更好,否則班級變得脆弱而無用。 – Thomas

+0

它不僅僅是關於語法糖;它是關於多態/動態的(單個,在Python的情況下)調度函數沒有(除非有特殊的裝飾器); OO代碼的確如此。另外,它關於可讀性:如果OO可用但未被使用,讀者會被困惑於「是否有一個特殊原因不能成爲一種方法?」。 –

0

以及與

S = Stack() 

覆蓋棧獲得的長度爲0的問題,一旦固定的,因爲你使用,你會得到一個崩潰:

var = s.pop() 

代替

var = S.pop() 

注意,這樣做的快速方法是

from collections import Counter 
counts = Counter(S) 
return counts['a'] == counts['b'] 
相關問題