[英]Implementing Iter for doubly-linked list
问题:刚接触python时,我目前正在尝试学习绳索,以更好地处理数组与链接结构之间的区别。 我试图创建一个链接列表类,以帮助更好地理解该语言及其结构。 到目前为止我写的是:
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)
self.head.prior = self.head.next = self.head
self.length = 0
def __str__(self):
if len(self)==0:
return '[]'
else:
return '[' + ', '.join(str(x) for x in self) + ']'
def __repr__(self):
"""Supports REPL inspection. (Same behavior as `str`.)"""
return str(self)
def __len__(self):
"""Implements `len(self)`"""
return self.length
def __iter__(self):
"""Supports iteration (via `iter(self)`)"""
cursor = self.head
while cursor:
yield cursor.val
cursor = cursor.next
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
在下面的代码中进行测试,我将遇到一个问题,即内核任务不会结束,或者调试器将指向失败的测试代码的第7行。 我不认为我的__repr__
方法是错误的,这就是为什么我要问,如何编辑__iter__
方法主体以解决此问题? 我以为我要做的就是遍历游标中的值。
from unittest import TestCase
tc = TestCase()
lst = LinkedList()
for d in (10, 20, 30, 40, 50):
lst.append(d)
tc.assertEqual('[10, 20, 30, 40, 50]', str(lst))
tc.assertEqual('[10, 20, 30, 40, 50]', repr(lst))
因为您说self.head
是前哨节点,所以您的__iter__
是不正确的; 它正在测试,好像它希望找到一个“虚假”值(例如None
)一样,当被循环链接时,它将永远不会达到这一点。 大概,您想要这样的东西:
def __iter__(self):
"""Supports iteration (via `iter(self)`)"""
cursor = self.head.next # Must advance past non-valued head
# Done when we get back to head
while cursor is not self.head:
yield cursor.val
cursor = cursor.next
您有一个循环清单。 我用通常的高科技方法对此进行了诊断:打印报表。 :-)
我在您的str方法中插入了一些图片:
def __str__(self):
if len(self)==0:
return '[]'
else:
print "NODE VALUE:", self.head.val
for x in self:
print "LIST ITEM", x
return '[' + ', '.join(str(x) for x in self) + ']'
...并减少测试的力度:
lst = LinkedList()
for d in (10, 20, 30, 40, 50):
lst.append(d)
print "str\t", str(lst)
您的方法遍历五个期望值和一个None标头。
LIST ITEM None
LIST ITEM 10
LIST ITEM 20
LIST ITEM 30
LIST ITEM 40
LIST ITEM 50
LIST ITEM None
LIST ITEM 10
LIST ITEM 20
LIST ITEM 30
LIST ITEM 40
LIST ITEM 50
LIST ITEM None
LIST ITEM 10
LIST ITEM 20
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.