在python中查找嵌套项的索引

shu*_*ltz 2 python arrays indexing tuples

我一直在使用一些相对复杂的数组,例如:

array = [ "1", 2, ["4", "5", ("a", "b")], ("c", "d")]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来找到一个项目并检索是"索引"(是否可以引用项目的位置,如"a" - 在元组内部作为与数组相同级别的索引?)

现在我的第一个想法是使用类似简单帮助函数的东西,例如:

def myindex(nestedlist, item):
    for i in nestedlist:
        if item in i:
         index = []
         index.append(i)
         index.append(i.index(item))
         return index
Run Code Online (Sandbox Code Playgroud)

但是我相信你可以猜测这样的函数不会有多大好处,特别是因为我事先并不知道数组可能有多少级别,以及每个级别可能包含的内容(就数据类型/结构而言) )

任何正确方向的提示都将非常感激!

jon*_*rpe 6

你想要的是:

def myindex(lst, target):
    for index, item in enumerate(lst):
        if item == target:
            return [index]
        if isinstance(item, (list, tuple)):
            path = myindex(item, target)
            if path:
                return [index] + path
    return []
Run Code Online (Sandbox Code Playgroud)

作为递归,这将处理任意深度的嵌套(直到递归限制).

对于你的例子array,我得到:

>>> myindex(array, "a")
[2, 2, 0]
Run Code Online (Sandbox Code Playgroud)

正如Adam在评论中提到的那样,明确地检查实例类型并不是非常Pythonic.一个鸭子类型的,"更容易请求原谅比许可"替代方法是:

def myindex(lst, target):
    for index, item in enumerate(lst):
        if item == target:
            return [index]
        if isinstance(item, str): # or 'basestring' in 2.x
            return []
        try:
            path = myindex(item, target)
        except TypeError:
            pass
        else:
            if path:
                return [index] + path
    return []
Run Code Online (Sandbox Code Playgroud)

字符串的具体处理是必要的,因为即使是空字符串也可以迭代,导致无休止的递归.