如何在嵌套列表中查找给定的元素?

问题描述:

这是我的迭代求解:如何在嵌套列表中查找给定的元素?

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)) 

这不工作;它不应该,因为没有停止。此外,它没有考虑列表清单;我不知道该怎么做。

任何答案,评论,等意识到

+1

'arg [0:] == arg'。你的递归调用需要在'arg [1:]' –

+0

为什么你的LA想要双递归?这很容易解决单递归?正如你所看到的,到目前为止,4个解决方案中有3个只有一个递归。 – Prune

如果我们考虑到这些情况:

  • 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:]))) 
+0

@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 
+0

对不起,你是对的。我认为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"])) 
+0

很高兴您找到了可行的解决方案!我很好奇,如果你能告诉我为什么我的答案不被视为函数式编程。 –

+0

@CraigBurgler再次感谢男人!对不起,选择谁给出最佳答案真的很难,因为大多数答案都很棒,内容丰富。至少根据我们的L.I函数式编程意味着一个函数不应该改变任何变量,所以当你调用'if key in list'时,你正在使用python中的内置迭代器,这实际上是在改变变量的同时!我不确定这是否是一个答案,但我更像是一个有说服力的程序员,通常不关心在功能性编程中似乎很重要的细节 –

+0

感谢您的回复!我只是好奇你的声明,没有任何解决方案是纯粹的功能。在我看来,4个贡献的解决方案中有3个不使用循环或更改变量,除了分配给您的函数参数。我只是想了解专门使这三种解决方案无法运作的原因以及解决方案的不同之处。 –