排除不等错误?

时间:2016-06-11 17:51:26

标签: python performance

我正在创建一个LinkedList类,以便更好地了解python语言及其双向链接节点。我的总体任务是不使用python的内置列表数据结构,同时还试图优化代码的时间效率。修复我假设的最好方法是使用 getitem setitem 方法体。

class LinkedList:
    class Node:
        def __init__(self, val, prior=None, next=None):
            self.val = val
            self.prior = prior
            self.next  = next

    def __init__(self):
        self.head = LinkedList.Node(None) # sentinel node (never to be removed)
        self.head.prior = self.head.next = self.head # set up "circular" topology
        self.length = 0


### prepend and append

    def prepend(self, value):
        n = LinkedList.Node(value, prior=self.head, next=self.head.next)
        self.head.next.prior = self.head.next = n
        self.length += 1

    def append(self, value):
        n = LinkedList.Node(value, prior=self.head.prior, next=self.head)
        n.prior.next = n.next.prior = n
        self.length += 1


### subscript-based access ###

    def _normalize_idx(self, idx):
        nidx = idx
        if nidx < 0:
            nidx += len(self)
            if nidx < 0:
                nidx = 0
        return nidx

    def __getitem__(self, idx):
        """Implements `x = self[idx]`"""
        nidx = self._normalize_idx(idx)
        currNode = self.head.next
        for i in range(nidx):
            currNode = currNode.next
        if nidx >= len(self):
            raise IndexError
        return currNode.val


    def __setitem__(self, idx, value):
        """Implements `self[idx] = x`"""
        nidx = self._normalize_idx(idx)
        currNode = self[nidx]
        if nidx >= len(self):
            raise IndexError
        currNode = value

    def __delitem__(self, idx):
        """Implements `del self[idx]`"""
        nidx = self._normalize_idx(idx)
        currNode = self.head.next
        if nidx >= len(self):
            raise IndexError
        for i in range(nidx+1, len(self)):
            self[i-1] = self[i]
        del self[len(self)-1]

使用以下方法测试此代码:

    # test subscript-based access
from unittest import TestCase
import random

tc = TestCase()
data = [1, 2, 3, 4]
lst = LinkedList()
for d in data:
    lst.append(d)

for i in range(len(data)):
    tc.assertEqual(lst[i], data[i])

with tc.assertRaises(IndexError):
    x = lst[100]

with tc.assertRaises(IndexError):
    lst[100] = 0

with tc.assertRaises(IndexError):
    del lst[100]

lst[1] = data[1] = 20
del data[0]
del lst[0]

for i in range(len(data)):
    tc.assertEqual(lst[i], data[i])

我得到一个错误,说1!= 20.写这些课程方法似乎总是让我失望,我可能会错过什么?我不确定这与典型的阵列支持列表有何不同。而且我不确定这个价值来自何处。

1 个答案:

答案 0 :(得分:1)

  

我收到错误说1!= 20

这是一个真实的陈述,所以你的问题存在于如何设置列表的数据。它没有更新,但Python列表是。

  

我不确定这个值是来自哪个

嗯......也许是lst[1] = data[1] = 20

无论如何,我不认为你的setItem函数是正确的。 curNode变量只有一个值,而不是基于getItem方法的Node对象引用,因此,currNode = value实际上并没有更新列表,只有局部变量作用于那个功能。