我开始学习python,然后到达列表和递归。我看到了一个练习。它写了一个函数,它接受两个列表作为参数,并检查第一个是否是第二个的子列表。请注意,列表中的元素可能是列表本身。一开始我认为这很容易但后来我发现棘手的是我的函数必须接受嵌套列表(如[1,2,[3,[4,5]]])并且必须在递归中。我知道如何使用递归和普通列表来完成它。我不知道如何将递归应用于嵌套列表。你能救我吗?
el1 = ''
el2 = ''
list1 = []
list2 = []
while el1 != "exit":
el1 = input("Insert the words of the first list: ")
print("write exit to finish")
list1.append(el1)
while el2 != "exit":
el2 = input("Insert the words of the second list: ")
print("write exit to finish")
list2.append(el2)
for x in list2:
if x not in list1:
print("FALSE")
break
else:
print("TRUE")
break
答案 0 :(得分:1)
另一种方法,尝试从第二个列表中构建第一个列表的项目。如果长度改变,则意味着第一个列表的项目也在第二个列表中,否则:True。
要澄清这个想法,请查看此快速示例:
l1= ['alpha','beta']
l2= ['alpha','beta','gama','theta']
l3= ['AnotherWord']
print len(list(set(l2)-set(l1)))==len(l2) #Case where l1 is a sublist of l2
print len(list(set(l2)-set(l3)))==len(l2) #case where l3 is not a sublist of l2
所以你的代码看起来像是:
el1 = ''
el2 = ''
list1 = []
list2 = []
while el1 != "exit":
el1 = input("Insert the words of the first list: ")
print("write exit to finish")
list1.append(el1)
while el2 != "exit":
el2 = input("Insert the words of the second list: ")
print("write exit to finish")
list2.append(el2)
if len(list(set(list2)-set(list1)))==len(list2):
print("List 1 is a sublist of List 2")
else:
print("List 1 is not a sublist of List 2")
<强>更新强>
a,b= [1,2,[3,[4,5]]], [4,5]
c,d= [1,2,[3,[4,5]]], [3,4,5]
def isSublist(a,b):
return any(x if x==b else isSublist(x,b) for x in a if isinstance(x,list) )
print isSublist(a,b) #True
print isSublist(c,d) #False
答案 1 :(得分:0)
我理解这个练习的方式是[1,3] 不是[1,2,3]的子列表,而是[2,3]是[1]的子列表,[2,3]。在这种情况下,如果B中存在元素el
使得el == A
,则列表A是B的子列表。为了找到这个el
,你需要递归遍历B,这里是你的代码的骨架,这样你就可以弄清楚其余的并完成练习:
def is_sublist(x,y):
for item in x:
# some comparison and control flow
if isinstance(item, list):
# some code recursively calling is_sublist and more control flow
以下是最终代码的一些测试:
print is_sublist([1,2,[3,[4,5]]], [4,5]) # True
print is_sublist([1,2,[3,[4,5]]], [3,[4,5]]) # True
print is_sublist([1,2,[3,[4,5]]], [3,4,5]) # False