如何在python多表中找到给定值的索引?

2024-05-23 19:14:35 发布

您现在位置:Python中文网/ 问答频道 /正文

下面给出的是一个示例多列表,我正在处理。现在我需要找到给定值的indices,如果它出现在列表中的任何地方。例如:对于lis[0][2][2][1][0] which is 'span 1 2',我想得到的索引是[0,2,2,1,0]。在

lis = [['Root', ['span 1 6'], ['Nucleus', ['span 1 3'], ['Nucleus', ['span 1 2'],  ['Nucleus', ['leaf 1'],  ['text',  "Specific knowledge "]], ['Satellite', ['leaf 2'], ['rel2par Elaboration'], ['text', 'required !_']]], ['Satellite', ['leaf 3'], ['rel2par Elaboration'], ['text', 'The tester is ']]], ['Satellite', ['span 4 6'], ['rel2par Elaboration'], ['Satellite', ['leaf 4'], ['rel2par Attribution'], ['text', 'For instance , the tester is aware!_']], ['Nucleus', ['span 5 6'],  ['Nucleus', ['leaf 5'], ['rel2par Contrast'], ['text', 'that a!_']], ['Nucleus', ['leaf 6'], ['rel2par Contrast'], ['text', 'but ']]]]]]

我尝试了以下方法(从网络来源修改)。在

^{pr2}$

这里的问题是,sibling(同一级别的列表)的索引也会返回,但并不总是这样。一些示例输出如下所示

for 0,2,3,1 it returns 0,2,3,1,0, similarly for lis[0][2][3][4][3][3] it returns 0,2,3,3,4,3,3等等。可能的问题是什么?在


Tags: text示例列表forisitspantester
2条回答

下面是深度优先和广度优先搜索的实现,不限于字符串。搜索一个列表或元组需要一些修改。在

>>> l = [['Root', ['span 1 6'], ['Nucleus', ['span 1 3'], ['Nucleus', ['span 1 2'],  ['Nucleus', ['leaf 1'],  ['text',  "Specific knowledge "]], ['Satellite', ['leaf 2'], ['rel2par Elaboration'], ['text', 'required !_']]], ['Satellite', ['leaf 3'], ['rel2par Elaboration'], ['text', 'The tester is ']]], ['Satellite', ['span 4 6'], ['rel2par Elaboration'], ['Satellite', ['leaf 4'], ['rel2par Attribution'], ['text', 'For instance , the tester is aware!_']], ['Nucleus', ['span 5 6'],  ['Nucleus', ['leaf 5'], ['rel2par Contrast'], ['text', 'that a!_']], ['Nucleus', ['leaf 6'], ['rel2par Contrast'], ['text', 'but ']]]]]]
>>> def depth_first(term,data):
...   for i, item in enumerate(data):
...     if isinstance(item,Sequence) and not isinstance(item,basestring):
...       r = depth_first(term,item)
...       if not r is None:
...         return [i] + r
...     else:
...       if item == term:
...         return [i]
...
>>> def breadth_first(term,data):
...   later = []
...   for i, item in enumerate(data):
...     if isinstance(item,Sequence) and not isinstance(item,basestring):
...       later.append((i,item))
...     else:
...       if item == term:
...         return [i]
...   for i, item in later:
...     r = breadth_first(term,item)
...     if not r is None:
...       return [i] + r
>>> depth_first('span 1 2',l)
[0, 2, 2, 1, 0]
>>> breadth_first('span 1 2',l)
[0, 2, 2, 1, 0]
>>> def trail(word, lst):
...     if word in lst:
...         return [lst.index(word)]
...     for i, x in enumerate(lst):
...         if not isinstance(x, list):
...             continue
...         ret = trail(word, x)
...         if ret is not None:
...             return [i] + ret
... 
>>> trail('span 1 2', lis)
[0, 2, 2, 1, 0]
>>> lis[0][2][2][1][0]
'span 1 2'
>>> trail('no such string', lis)
>>> 

相关问题 更多 >