如何只使用car、cdr、cons和其他函数(python)来拆分列表



我们需要能够生成一个有1个列表作为输入的函数。我们需要把偶数和奇数分开,并把它们放在单独的列表中。我们不允许制作第二个列表,应该只能使用递归和car、cdr、cons…来解决它。

这就是我已经拥有的:

def split_list(list_a):
if null(list_a):
return []
elif not even(car(list_a)):
return cons(car(list_a), split_list(cdr(list_a)))
else:
return cons(splits_lijst(cdr(list_a)), car(list_a))
print(split_list([1, 2, 3, 4]))

我变成了输出:[1, 3, 4, 2]

而它应该是:[1, 3][2, 4]

如果不列出第二个清单,我真的不知道该怎么做。

需要明确的是,函数"split_list"中的函数有car、cdr、cons、null甚至。在这里你可以看到这些功能的内容:

def car(a_list):
return a_list[0]
def cdr(a_list):
return a_list[1:]
def null(a_list):
return True if len(a_list) == 0 else False
def cons(a, b):
new_list = []
if type(a) is list:
for item in a:
new_list.append(item)
else:
new_list.append(a)
if type(b) is list:
for item in b:
new_list.append(item)
else:
new_list.append(b)
return new_list
def even(x):
if x == 1:
return False
elif x == 0:
return True
else:
return even(x-2)

在一个列表的迭代过程中,您需要一种方法来生成两个列表。最好的方法是生成一个包含3个参数的函数。一个用于输入,2个用于两个输出列表,通常称为累加器。

逻辑是在到达列表末尾时返回两个累加器的列表。如果不是,则检查元素的均匀性,并通过将其添加到偶数累加器来递归。如果不是,则通过将元素添加到奇数累加器来递归。

我想这会对你有所帮助。

l=list(range(10))
evens=[]
odds=[]
for x in l:
if x%2==0:
evens.append(x)
else:
odds.append(x)
print(evens,odds)

下面的一个将只使用一个额外的列表(以防您不需要原始列表(:

l=list(range(10))
odds=[]
for x in l:
if x%2==0:
continue
else:
l.remove(x)
odds.append(x)
print(l,odds)

最新更新