Python递归列表搜索功能

时间:2015-04-14 03:49:00

标签: python list search recursion

我必须编写一个递归函数来搜索列表中的特定值。该函数应该查找该数字是否在列表中,如果是,它将返回该值的列表索引。

例如:

search([1,2,3,4,5],3)

应该返回:

2

因为3出现在列表索引2中。

现在我有:

def search(myList, number):
    if myList[0] == number:
        return myList[0]
    return search(myList[1:], number)

它为我之前的同一个函数调用返回3。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

您当前的代码中有2个错误,您返回的数字是iteself而不是索引,并且您并没有真正传递递增的索引。所以,请改为:

>>> def search(myList, number):
...     if myList[0] == number:
...         return 0
...     return 1 + search(myList[1:], number)
... 
>>> search([1,2,3,4,5],3)
2

现在,如果我们在列表中有数字,那么它是有效的,但如果没有,我们将得到一个索引错误。

>>> search([1,2,3,4,5],6)
IndexError: list index out of range

因此,我们应该将函数包装在try-except块

def search(myList, number):
    def search_recursive(lst, num):
        if lst[0] == num:
            return 0
        return 1 + search_recursive(lst[1:], num)
    try: return search_recursive(myList, number)
    except IndexError: return -1

现在,它会起作用

>>> search([1,2,3,4,5],6)
-1
>>> search([1,2,3,4,5],5)
4

但是只有当你想以递归方式执行此操作时才应使用上述内容,并注意当执行list[1:]时,执行列表切片,每次都会创建一个新列表。

因此,如果允许在不递归的情况下执行此操作,请使用内置list.index方法:

>>> def search(my_list, number):
...     try: return my_list.index(number)
...     except ValueError: return -1
... 
>>> search([1,2,3,4,5],5)
4
>>> search([1,2,3,4,5],6)
-1

答案 1 :(得分:2)

您还可以使用index内置方法:

>>> def search(my_list, val):
...     try:
...         return my_list.index(val)
...     except valueError:
...         return "not found"
...
>>> search([1,2,3,4,5],3)
2