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)
但是我相信你可以猜测这样的函数不会有多大好处,特别是因为我事先并不知道数组可能有多少级别,以及每个级别可能包含的内容(就数据类型/结构而言) )
任何正确方向的提示都将非常感激!
你想要的是:
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)
字符串的具体处理是必要的,因为即使是空字符串也可以迭代,导致无休止的递归.