我想定义一个名为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
函数不好。您应该初始化T
和F
,否则当您尝试返回它们时,其中一个可能没有定义。同样,您将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。