如何在嵌套列表中查找给定的元素?
这是我的迭代求解:如何在嵌套列表中查找给定的元素?
def exists(key, arg):
if not arg:
return False
else:
for element in arg:
if isinstance(element,list):
for i in element:
if i==key:
return True
elif element==key:
return True
return False
print(exists("f", ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]))
但是,我想湖人双递归函数来解决这个问题。
我尝试:
def exists(key, arg):
if not arg: //base case
return False
elif arg[0]==key: //if we find the key from the first trial
return True
else:
return (exists(arg[0:],key))
这不工作;它不应该,因为没有停止。此外,它没有考虑列表清单;我不知道该怎么做。
任何答案,评论,等意识到
如果我们考虑到这些情况:
-
my_list
是空的:关键是没有找到 -
my_list
不是一个清单:关键是没有找到 -
my_list
是一个非空列表(两种情况):-
my_list[0]
是关键:发现 - 否则,请在两种
my_list[0]
和my_list[1:]
-
关键的代码将
def exists(key, my_list):
if not isinstance(my_list, list) or not my_list:
return False
return (my_list[0] == key
or exists(key, my_list[0])
or exists(key, my_list[1:]))
甚至
def exists(key, my_list):
return (isinstance(my_list, list)
and len(my_list) > 0
and (my_list[0] == key
or exists(key, my_list[0])
or exists(key, my_list[1:])))
@Leowahyd哎呀,我在那一个留下了几个括号。 (已编辑) – molbdnilo
的逻辑是遍历每个元素在你的清单,检查:
- 如果列表:调用与子列表中再次功能。
- 如果等于键:返回True
- 其他:返回False
下面的示例代码中找到key
是否存在嵌套列表
def exists(key, my_list):
for item in my_list:
if isinstance(item, list):
if exists(key, item): # <--Recursive Call
return True
elif item == key:
return True
return False
# Example
>>> my_list = [[[1, 2, 3, 4, 5], [6, 7,]], [8, 9], 10]
>>> exists(2, my_list)
True
>>> exists(6, my_list)
True
>>> exists(8, my_list)
True
>>> exists(10, my_list)
True
>>> exists(11, my_list)
False
对不起,你是对的。我认为OP正在寻找一个没有循环的解决方案,因此(这是双递归问题)。 –
你是关。你只需要检查arg [0]是否是一个子列表,是否需要重新调用。接下来你缺少一个循环来遍历列表中的所有项目。这应该工作。
def exists(key, arg):
for item in arg:
if isinstance(item, list):
# Recursive call with sublist
if exists(key, item):
return True
else:
if item == key:
return True
return False
def exists(k, l):
if not isinstance(l, list):
return False
if k in l:
return True
return any(map(lambda sublist: exists(k, sublist), l))
感谢大家的帮助,在这里是我想出的答案。虽然它看起来并不像大多数已经提供的答案那样优雅,但是这个答案是我的实验指导员会接受的唯一答案,因为它是一种纯粹的函数式编程方法,意思是无副作用或循环:
def exists(key, seq):
if not seq:
return False
elif seq[0]==key:
return True
if isinstance(seq[0],list):
return(exists(key,seq[0]) or exists(key,seq[1:]))
else:
return exists(key,seq[1:])
return False
print(findkey("s", ["g","t", "e", ["s"], ["l","k","s",["d","f"],"w"], "o"]))
很高兴您找到了可行的解决方案!我很好奇,如果你能告诉我为什么我的答案不被视为函数式编程。 –
@CraigBurgler再次感谢男人!对不起,选择谁给出最佳答案真的很难,因为大多数答案都很棒,内容丰富。至少根据我们的L.I函数式编程意味着一个函数不应该改变任何变量,所以当你调用'if key in list'时,你正在使用python中的内置迭代器,这实际上是在改变变量的同时!我不确定这是否是一个答案,但我更像是一个有说服力的程序员,通常不关心在功能性编程中似乎很重要的细节 –
感谢您的回复!我只是好奇你的声明,没有任何解决方案是纯粹的功能。在我看来,4个贡献的解决方案中有3个不使用循环或更改变量,除了分配给您的函数参数。我只是想了解专门使这三种解决方案无法运作的原因以及解决方案的不同之处。 –
'arg [0:] == arg'。你的递归调用需要在'arg [1:]' –
为什么你的LA想要双递归?这很容易解决单递归?正如你所看到的,到目前为止,4个解决方案中有3个只有一个递归。 – Prune