Python 如何获取n维嵌套列表中元素的索引

Python 如何获取n维嵌套列表中元素的索引,python,function,nested-lists,Python,Function,Nested Lists,我是Python新手(一般来说是编程),我有一些不知道如何解决的问题。 我有许多不同的嵌套列表,都遵循这种模式: Listi=[string0,string1,…,stringn,[list0],[list1],…,[listn]] (列表包含一系列始终位于开头的字符串,后面是一系列始终位于后面的列表) 第一个列表中包含的列表与第一个列表具有相同的精确结构。 列表中可以有任意数量的列表 我想编写的是一个函数,给定一个随机元素(一个随机字符串),它会在列表中查找此类元素的索引,这样就可以从包含该元

我是Python新手(一般来说是编程),我有一些不知道如何解决的问题。 我有许多不同的嵌套列表,都遵循这种模式:

Listi=[string0,string1,…,stringn,[list0],[list1],…,[listn]]

(列表包含一系列始终位于开头的字符串,后面是一系列始终位于后面的列表)

第一个列表中包含的列表与第一个列表具有相同的精确结构。 列表中可以有任意数量的列表

我想编写的是一个函数,给定一个随机元素(一个随机字符串),它会在列表中查找此类元素的索引,这样就可以从包含该元素的主列表中调用该元素

我希望在操作数量方面获得实现这一目标的最佳方法,但任何解决方案都将不胜感激

这里有一些例子: 假设我有两个列表:

l1 = ['Node_50', ['Node_48', 'Node_23'], ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]
l2 = ['Node_50', ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']], ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]]
我想创建这样一个函数:

def functionfinder(list, element):
以便:

indexes = functionfinder(l1, "Node_40")
索引将是一个元组(2,2,1),因为:


因为您正在搜索嵌套列表,所以最好使用递归例程。由于您需要良好的速度,一旦找到所需的项目,例程应该立即退出(而不是继续搜索或寻找其他项目)。如果您实际上只使用列表作为字符串的容器,那么下面的方法应该有效

def functionfinder(asequence, value, indexes_tuple=()):
    for ndx, item in enumerate(asequence):
        if item == value:  
            return indexes_tuple + (ndx,) # found it here: return the answer
        if isinstance(item, list):
            result = functionfinder(item, value, indexes_tuple + (ndx,))
            if result:  
                return result # found it below: stop looking for it
    return ()  # desired value not found yet

l1 = ['Node_50',
      ['Node_48', 'Node_23'],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]
l2 = ['Node_50',
      ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]

indexes = functionfinder(l1, "Node_40")
print(indexes)
该代码的打印输出就是您想要的:

(2, 2, 1)
如果您有
索引
,并且希望访问搜索的值,则可以执行以下操作

result = l1
for ndx in indexes:
    result = result[ndx]
现在,
result
保存您搜索的值

这段代码可以推广到处理其他类型的序列,比如元组,而不仅仅是列表。您需要小心不要递归到字符串中,因为Python的字符串也是字符序列。您需要一个元组作为返回值,因此我的代码也使用它们。使用不可变类型作为返回值确实有好处。但使用可变类型(如列表)可能会加快执行速度。现在,参数中的每个新列表都需要构造一个完整的新索引元组。使用列表可能意味着您只需要附加一个新索引,并且可能会加快代码的速度。询问这些可能的改进是否对你有吸引力


请注意,由于Python没有内置的立即停止递归函数的方法,因此我的代码使用返回的空元组来说明尚未找到所需的项。当找到该项时,将返回一个非空元组结果,该结果指示所有级别的递归尽快停止。这会使代码有点复杂。

因为您正在搜索嵌套列表,所以最好使用递归例程。由于您需要良好的速度,一旦找到所需的项目,例程应该立即退出(而不是继续搜索或寻找其他项目)。如果您实际上只使用列表作为字符串的容器,那么下面的方法应该有效

def functionfinder(asequence, value, indexes_tuple=()):
    for ndx, item in enumerate(asequence):
        if item == value:  
            return indexes_tuple + (ndx,) # found it here: return the answer
        if isinstance(item, list):
            result = functionfinder(item, value, indexes_tuple + (ndx,))
            if result:  
                return result # found it below: stop looking for it
    return ()  # desired value not found yet

l1 = ['Node_50',
      ['Node_48', 'Node_23'],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]
l2 = ['Node_50',
      ['Node_48', 'Node_23', ['Node_12', 'Node_3'], ['Node_20']],
      ['Node_22', ['Node_44'], ['Node_7', 'Node_40']]
     ]

indexes = functionfinder(l1, "Node_40")
print(indexes)
该代码的打印输出就是您想要的:

(2, 2, 1)
如果您有
索引
,并且希望访问搜索的值,则可以执行以下操作

result = l1
for ndx in indexes:
    result = result[ndx]
现在,
result
保存您搜索的值

这段代码可以推广到处理其他类型的序列,比如元组,而不仅仅是列表。您需要小心不要递归到字符串中,因为Python的字符串也是字符序列。您需要一个元组作为返回值,因此我的代码也使用它们。使用不可变类型作为返回值确实有好处。但使用可变类型(如列表)可能会加快执行速度。现在,参数中的每个新列表都需要构造一个完整的新索引元组。使用列表可能意味着您只需要附加一个新索引,并且可能会加快代码的速度。询问这些可能的改进是否对你有吸引力


请注意,由于Python没有内置的立即停止递归函数的方法,因此我的代码使用返回的空元组来说明尚未找到所需的项。当找到该项时,将返回一个非空元组结果,该结果指示所有级别的递归尽快停止。这会使代码有点复杂。

您必须创建一个跟踪当前索引的递归函数(例如
2,1,1
),并遍历每个列表、子列表、子列表,直到找到您的项。您必须创建一个跟踪当前索引的递归函数(例如
2,1,1
)然后浏览每个列表、子列表、子列表,直到找到您的项目。非常感谢您提供的详细解决方案,这正是我想要的。返回元组对我的环境来说很好。谢谢现在又出现了另一个问题:如何访问具有包含其索引的元组的列表元素?@DanielCasasampera:请参阅我的答案中的添加内容。您知道调用具有索引的列表元素的其他方法吗?我希望能够做一些类似于:dell2[0][2]和l2[0][2]=的事情new@DanielCasasampera:如果索引已经分开,则可以执行
l1[2][2][0]
。这些分隔的括号是Python本身的样式。
numpy
模块允许您声明数组,以便您可以使用
l1[2,2,0]
,但这在Python本身不起作用。非常感谢您提供了详细的解决方案,这正是我想要的。返回元组对我的环境来说很好。谢谢现在又出现了另一个问题:如何访问具有包含其索引的元组的列表元素?@DanielCasasampera:请参阅我的答案中的添加内容。您知道调用具有索引的列表元素的其他方法吗?我希望能够做一些类似于:dell2[0][2]和l2[0][2]=的事情new@DanielCasasampera:如果你有索引