在Python中,如何返回一个嵌套嵌套元素的索引列表?

时间:2016-10-20 20:39:14

标签: python recursion functional-programming

说我有一个清单:

>>> nested=[[1, 2], [3, [4]]]

如果我正在寻找[1,1,0],我试图获得一个会返回4的函数。如果指定的元素不在列表中,那么它将返回一个空列表[]

Nested可以有任何结构,所以我认为某种类型的递归函数是最好的,但我无法控制结构的深度和广度。

这是不是的工作代码,但与我的想法一致:

def locate(x,element,loc=[0],counter=0):
    for c,i in enumerate(x):
        if isinstance(i,list):
            locate(i,loc+[0],counter+1)
        else:
            loc[counter]=c
            if i==element: return loc

函数调用看起来像这样:

>>> locate(nested,4)
[1,1,0]

递归函数可能不是最好的解决方案,只是我的尝试。

3 个答案:

答案 0 :(得分:5)

您可以考虑转而使用某种树数据结构,但这是您当前数据结构的示例:

from collections import Iterable

def flatten(collection, depth=()):
    for i, element in enumerate(collection):
        if isinstance(element, Iterable) and not isinstance(element, str):
            yield from flatten(element, depth=depth + (i,))
        else:
            yield element, depth + (i,)

def locate(nested, element):
    for v, indices in flatten(nested):
        if v == element:
            return indices

答案 1 :(得分:2)

def nested_find(l, e):
    for i, x in enumerate(l):
        if isinstance(x, list):
            t = nested_find(x, e)
            if t:
                return [i] + t
        elif x == e:
            return [i]

如果None不在e

,则会返回l

答案 2 :(得分:1)

如果找不到元素,则以下代码返回None,否则返回所需的输出:

   def locate(lst,ele):
        return  _locate(lst,ele,[])

    def _locate(lst,ele,res):
        for i,x in enumerate(lst):
            if isinstance(x,list):
                retVal = locate(x,ele,res+[i])
                if retVal is not None:
                    return retVal
            elif x==ele:
                return res+[i]
        return None