Python 在嵌套列表中查找索引

Python 在嵌套列表中查找索引,python,python-3.x,recursion,nested-lists,Python,Python 3.x,Recursion,Nested Lists,我试图创建一个函数,该函数将接受一个嵌套列表和一个项作为输入,并返回一个索引列表。 例如list=[0,5,6,8,7,3,6]],9,10]和item=7应该返回[2,2,0],因为list[2][2][0]=7 我的代码应该可以工作,因为我可以打印输出,但是当我运行它时,它不会返回任何结果 def find_item(list_input, item, current): if list_input == item: print(current) ## this do

我试图创建一个函数,该函数将接受一个嵌套列表和一个项作为输入,并返回一个索引列表。 例如
list=[0,5,6,8,7,3,6]],9,10]
item=7
应该返回
[2,2,0]
,因为
list[2][2][0]=7

我的代码应该可以工作,因为我可以打印输出,但是当我运行它时,它不会返回任何结果

def find_item(list_input, item, current):
    if list_input == item:
        print(current) ## this does give the desires output, but the function should return not print
        return current
    else:
        if isinstance(list_input, list):
            for j in range(len(list_input)):
                current.append(j)
                find_item(list_input[j], item, current)
                del current[-1]

这里我忽略了什么?

正如@tzaman提到的,您需要处理
find\u item
递归调用的返回值。如果递归调用的返回值是一个列表,则意味着找到了搜索项,我们需要停止递归

以下修改将返回搜索项最早找到的索引。如果找不到任何项目,它将返回
None

def find_item(list_input, item, current):
    if list_input == item:
        return current
    else:
        if isinstance(list_input, list):
            for j in range(len(list_input)):
                current.append(j)
                search_result = find_item(list_input[j], item, current)
                if isinstance(search_result, list):
                    return search_result
                del current[-1]

list_input  = [0, 5, [6, 8, [7, 3, 6]], 9, 10]
item = 7
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], 9, 10]
item = 9
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], [30, 4], 9, 10]
item = 4
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], [30, 4], 9, 10]
item = 400
print(find_item(list_input, item, []))
输出:

[2, 2, 0]
[3]
[3, 1]
None

正如@tzaman所提到的,您需要处理
find\u item
递归调用的返回值。如果递归调用的返回值是一个列表,则意味着找到了搜索项,我们需要停止递归

以下修改将返回搜索项最早找到的索引。如果找不到任何项目,它将返回
None

def find_item(list_input, item, current):
    if list_input == item:
        return current
    else:
        if isinstance(list_input, list):
            for j in range(len(list_input)):
                current.append(j)
                search_result = find_item(list_input[j], item, current)
                if isinstance(search_result, list):
                    return search_result
                del current[-1]

list_input  = [0, 5, [6, 8, [7, 3, 6]], 9, 10]
item = 7
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], 9, 10]
item = 9
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], [30, 4], 9, 10]
item = 4
print(find_item(list_input, item, []))

list_input  = [0, 5, [6, 8, [7, 3, 6]], [30, 4], 9, 10]
item = 400
print(find_item(list_input, item, []))
输出:

[2, 2, 0]
[3]
[3, 1]
None

当有人在递归函数的中间粘贴< <代码>循环>时,我总是感到困扰!以下是解决此问题的另一种方法:

def find_item(list_input, item, index=0):
    if list_input:
        head, *tail = list_input

        if head == item:
            return [index]

        if isinstance(head, list):
            if result := find_item(head, item):
                return [index] + result

        return find_item(tail, item, index + 1)
    
    return list_input

list_input  = [0, 5, [6, 8, [7, 3, 1]], 9, 10]

print(find_item(list_input, 7))
此解决方案不需要显式的第三个参数。在找不到项目时返回空的
列表
,而不是
None
。注意使用新的walrus操作符:=

            if result := find_item(head, item):
如果这是一个问题,请改为:

            result = find_item(head, item)
            if result:

当有人在递归函数的中间粘贴< <代码>循环>时,我总是感到困扰!以下是解决此问题的另一种方法:

def find_item(list_input, item, index=0):
    if list_input:
        head, *tail = list_input

        if head == item:
            return [index]

        if isinstance(head, list):
            if result := find_item(head, item):
                return [index] + result

        return find_item(tail, item, index + 1)
    
    return list_input

list_input  = [0, 5, [6, 8, [7, 3, 1]], 9, 10]

print(find_item(list_input, 7))
此解决方案不需要显式的第三个参数。在找不到项目时返回空的
列表
,而不是
None
。注意使用新的walrus操作符:=

            if result := find_item(head, item):
如果这是一个问题,请改为:

            result = find_item(head, item)
            if result:

您还需要处理递归
find_item
调用的返回值。首先,您没有返回任何内容:这是否回答了您的问题?您还需要处理递归
find_item
调用的返回值。首先,您没有返回任何内容:这是否回答了您的问题?