Python 链表类函数

Python 链表类函数,python,python-3.x,Python,Python 3.x,我想创建这个函数 >>> str(Link('Hello')) 'Hello' >>> str(Link(1, Link(2))) '1 -> 2' >>> print(Link(1 / 2, Link(1 // 2))) 0.5 -> 0 >>> str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))

我想创建这个函数

    >>> str(Link('Hello'))
    'Hello'

    >>> str(Link(1, Link(2)))
    '1 -> 2'

    >>> print(Link(1 / 2, Link(1 // 2)))
    0.5 -> 0

    >>> str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))))
    '(1 -> 2 -> 3) -> 4 -> 5'

    >>> print(Link(Link(Link(Link('Wow')))))
    (((Wow)))

    >>> print(Link(Link('a'), Link(Link('b'), Link(Link('c')))))
    (a) -> (b) -> (c)
这是我的密码:

def __str__(self):
    result = ''
    while self.rest is not Link.empty:
        result += '{0} -> '.format(self.first)
        self = self.rest
    return result + '{0}'.format(self.first)
然而,为了完成最后三个博士学位,我不知道该怎么做。 救命啊


看起来规则应该是,如果列表的头本身就是一个列表,那么您可以格式化该列表,并将其放在括号中。大概是这样的:

first = '({0})'.format(self.first) if isinstance(self.first, Link) else first
result += '{0} -> '.format(first)
first = str(self.first)
if isinstance(self.first, Link):
    first = '({0})'.format(first)
if self.rest is Link.empty:
    return first
rest = str(self.rest)
if isinstance(self.rest, Link):
    return '{0} -> {1}'.format(first, self.rest)
else:
    # surely (1 2 . 3) is not the same list as (1 2 3) but the spec left it out?
    return '{0} .. {1}'.format(first, self.rest)
现在,避免在
rest
上使用递归有点奇怪,但是首先在
上间接使用递归。(这就是
'{0}.format(…)
所做的。如果您没有定义
\uuuuuuuuuuuuuuuuu
方法,它将调用您的
\uuuuuuuuuuuu
方法。)

所以,假设这是一个赋值,如果赋值告诉你不要使用递归,你需要把它变成一个循环。另一方面,如果赋值没有说要避免递归,那么在这两种情况下都递归就简单多了:

first = str(self.first)
if isinstance(self.first, Link):
    first = '({0})'.format(first)
if self.rest is Link.empty:
    return first
return '{0} -> {1}'.format(first, self.rest)

作为一个旁注:这是一个股票计划练习,移植到Python的效果很差(这意味着你的老师要么不懂Python,要么不喜欢Python,这不是一个好的迹象……),但它缺少了一部分

通常情况下,您应该以不同于
链接(1,2)的方式处理链接(1,2)
。(用Lisp术语来说,这是
(1.2)
(1.2)
)的对比,但是您给出的示例中没有一个可以测试这一点,因此不清楚您应该为前者输出什么。除非你想做这样的事情,否则要准备好因为没有读懂老师的心思而被划掉:

first = '({0})'.format(self.first) if isinstance(self.first, Link) else first
result += '{0} -> '.format(first)
first = str(self.first)
if isinstance(self.first, Link):
    first = '({0})'.format(first)
if self.rest is Link.empty:
    return first
rest = str(self.rest)
if isinstance(self.rest, Link):
    return '{0} -> {1}'.format(first, self.rest)
else:
    # surely (1 2 . 3) is not the same list as (1 2 3) but the spec left it out?
    return '{0} .. {1}'.format(first, self.rest)