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

How to separate a linked list by a predicate in python?

我想定义一个名为separate的迭代函数;它被传递给一个链表和一个谓词;它 returns 两个链表的二元组:第一个是谓词 returns True 的参数中所有值的链表;第二个是谓词 returns 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,否则当您尝试 return 它们时其中之一可能未定义。此外,您将 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 对象中,我认为值应该是 Integer 类型,nextLN 类型。另外,您似乎在分配 T = LN(a, b) 时违反了此合同,其中 b 可以是整数。发生这种情况时,Python 尝试对 Integer 执行 .value,结果引发 AttributeError。