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

时间:2016-09-22 14:01:29

标签: python recursion functional-programming

这是我的迭代解决方案:

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

然而,我的L.A.想要一个双递归函数来解决这个问题。

我的尝试:

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

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

任何回答,评论等都表示赞赏

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

逻辑是迭代列表中的每个元素并检查:

  • 如果list:再次使用子列表调用该函数。
  • 如果等于键:返回True
  • else:返回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

答案 2 :(得分:2)

你很亲密。您只需要检查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

答案 3 :(得分:2)

如果我们考虑这些情况:

  • bool init(void* ptriface, int version) { void* iface; // todo: make this type to required version // Cast iface at run-time according to version number // switch(version){} iface = reinterpret_cast<MSTSCLib::IMsRdpClient9*>(ptriface); iface = reinterpret_cast<MSTSCLib::IMsRdpClient8*>(ptriface); iface = reinterpret_cast<MSTSCLib::IMsRdpClient7*>(ptriface); // switch(version){} iface->putSomeData1(); iface->putSomeData2(); iface->putSomeData3(); iface->putSomeData4(); } 为空:未找到密钥
  • 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:]))

答案 4 :(得分:2)

感谢大家的帮助,这是我想出的答案。虽然它看起来不像已经提供的大多数答案那样优雅,但这个答案是我的实验室教师将接受的唯一答案,因为它是一种纯函数式编程方法,意味着没有副作用或循环:

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