如何在python中通过谓词分隔链表



我想定义一个名为separate的迭代函数;它被传递一个链表和一个谓词;它返回一个由两个链表组成的二元组:第一个是参数中谓词返回True的所有值的链表;第二个是参数中谓词返回False的所有值的链表;每个列表中的值必须与其在参数链表中的顺序相反。

这是我的代码:

class LN:
def __init__(self,value,next=None):
    self.value = value
    self.next  = next

#

def list_to_ll(l):
    if l == []:
        return None
    front = rear = LN(l[0])
    for v in l[1:]:
        rear.next = LN(v)
        rear = rear.next
    return front
def str_ll(ll):
    answer = ''
    while ll != None:
        answer += str(ll.value)+'->'
        ll = ll.next
    return answer + 'None'

,

ll = list_to_ll([0,1,2,3,4,5,6,7,8,9])
even,odd = separate(ll,lambda x : x%2 == 0)
print(str_ll(even)+' and '+str_ll(odd))

我应该得到:

8->6->4->2->0 and 9->7->5->3->1

这是我单独的函数:

def separate(ll,p):
    if ll == None:
        return (None,None)
    else:
        while ll != None:
            a = ll.value
            ll = ll.next
            if ll != None:
                b = ll.value
            else:
                b = None        
            if p(a):
                T = LN(a,b)
                a = b
            if not p(a):
                F = LN(a,b)
                a = b
        return (T,F)    

会引发AttributeError: 'int'对象没有属性'value'。我该怎么做才能解决这个问题?

您的separate函数不好。您应该初始化TF,否则当您尝试返回它们时,其中一个可能没有定义。同样,您将b设置为一个值,但随后将其用作LN的第二个参数。我不知道你想用b做什么,所以我只是为了这个简单的解决方案而摆脱了它:

def separate(ll, p):
    T = F = None
    while ll:
        a = ll.value
        if p(a):
            T = LN(a, T)
        else:
            F = LN(a, F)
        ll = ll.next
    return T, F

您的LN构造函数接受一个值和一个下一个节点,但是您向它传递了两个值。

在LN对象中,我认为value的类型是Integer, 下一个类型LN。另外,在赋值T = LN(a, b)中,你似乎违反了这个契约,其中b可以是整数。当发生这种情况时,Python会尝试对Integer执行.value,结果引发AttributeError。

相关内容

  • 没有找到相关文章

最新更新