2013-03-29 82 views
1

我似乎無法讓我的len功能工作,我一直在嘗試堆的東西,但我是一個完整的初學者,所以我很肯定我缺少一些完全明顯的東西。這是我的代碼...蟒雙鏈表__len__

def __len__(self): 
    if self.head is None: 
     return 0 
    else: 
     return self.size 

我的想法很簡單。如果雙鏈表的頭部是None,那麼它必須是空的,所以返回0,否則返回列表的大小。

但是,我得到一個錯誤asssertion說...

AssertionError: List should contain 1 element, but length is 0 

任何幫助表示讚賞,謝謝提前。

編輯:這是代碼運行的多數民衆贊成我的功能...

testList.add(14) 
assert len(testList) == 1, "List should contain 1 element, but length is %r" % len(testList) 

EDIT2:這是我的附加功能,即時通訊相當肯定其右,我花2個小時吧...

def add(self, value): 
    newNode = DoubleListNode(value) 
    if self.head is None: 
     self.head = newNode 
     self.tail = newNode 
     newNode.prev = None 
     newNode.next = None 
     return newNode 
    elif value < self.head.data: 
     self.head = newNode 
     newNode.next = self.head 
     newNode.prev = None 
     return newNode 
    elif value > self.tail.data: 
     self.tail = newNode 
     newNode.prev = self.tail 
     newNode.next = None 
     return newNode 
    else: 
     node = self.head 
     node2 = node 
     while node is not None and node.data < value : 
      node = node.next 
      node2 = node.prev 
     newNode.next = node.prev 
     newNode.prev = node2.next 
     return newNode 
+3

您使用此列表並獲取該錯誤的代碼在哪裏? – BrenBarn

+0

您需要提供有問題的實際代碼 – jamylak

+2

在得到'AssertionError'之前,您是否需要斷言某些內容? –

回答

1

您的add函數沒有任何東西會增加self.size。所以無論你在__init__,它可能0設置它。

因此,當列表實際爲空時,__len__返回0,因爲self.headNone

你添加元素後,它仍然回報因爲0self.size0


此外,您的代碼中至少還有一個其他問題。看看這個:

elif value > self.tail.data: 
    self.tail = newNode 
    newNode.prev = self.tail 
    newNode.next = None 
    return newNode 

顯然,newNode.prev將要結束了在自己指指點點,而不是以前的尾巴。

有很多事情可以幫助判斷代碼單元測試的正確性,沒有用過代碼的人進行代碼評審,通過交互式可視化工具逐步完成代碼審查,正式證明等等 - 但是,你工作的時間不是這些事情之一。

+0

即時將要測試這一點。並看看是否有效,謝謝 – user2218154

+0

它的工作,謝謝大家的幫助。我從來沒有想過,我的len函數的問題是因爲我的add函數!我必須學會在盒子外面思考! – user2218154

+0

+1 - 我希望我可以再次*對於陳述「有很多事情可以幫助判斷代碼的正確性......你工作的小時數不是這些事情之一」 – mgilson