我是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),因为:
l1[2][2][1] = Node_40
答案 0 :(得分:0)
由于您正在搜索嵌套列表,因此最好使用递归例程。由于您希望获得良好的速度,因此例程应在找到所需项目后立即退出(而不是继续搜索或寻找其他项目)。如果您实际上仅使用列表作为字符串的容器,则下面的方法应该起作用。
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)
如果您拥有indexes
,并且想要访问搜索到的值,则可以
result = l1
for ndx in indexes:
result = result[ndx]
现在result
保留您搜索的值。
可以将此代码通用化以处理其他类型的序列,例如元组,而不仅仅是列表。您需要注意不要递归为字符串,因为Python的字符串也是字符序列。您需要一个元组作为返回值,因此我的代码也使用它们。使用不可变类型作为返回值确实具有优势。但是使用可变类型(例如列表)可能会加快执行速度。现在,参数中的每个新列表都需要构造一个完整的索引新元组。使用列表可能意味着您只需要添加一个新索引即可加快代码的速度。询问其中一种可能的改进对您是否有吸引力。
请注意,由于Python没有内置的立即方法来停止递归函数,因此我的代码使用返回的空元组来指出尚未找到所需的项。找到该项目后,将返回一个非空的元组结果,该结果表示递归的所有级别都将尽快停止。这会使代码有些复杂。