如何通过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
功能不好。您应该初始化 T
和 F
,否则当您尝试 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 类型,next 是 LN 类型。另外,您似乎在分配 T = LN(a, b) 时违反了此合同,其中 b 可以是整数。发生这种情况时,Python 尝试对 Integer 执行 .value,结果引发 AttributeError。
我想定义一个名为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
功能不好。您应该初始化 T
和 F
,否则当您尝试 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 类型,next 是 LN 类型。另外,您似乎在分配 T = LN(a, b) 时违反了此合同,其中 b 可以是整数。发生这种情况时,Python 尝试对 Integer 执行 .value,结果引发 AttributeError。