说我有一个清单:
>>> 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]
递归函数可能不是最好的解决方案,只是我的尝试。
答案 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