2014-09-19 77 views
0

下面给出了我正在使用的示例多列表。现在我需要找到给定值的indices,如果它出现在列表中的任何位置。例如:对于lis[0][2][2][1][0] which is 'span 1 2',我想索引为[0,2,2,1,0]如何查找python多列表中给定值的索引?

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 ']]]]]] 

我尝试了以下(从网络源修改)。

from copy import copy 
def scope2(word, list, indexes = None): 
    flag = 0 
    result = [] 
    if not indexes: 
     indexes = [] 
    for index, item in enumerate(list): 
     try: 
      current_index = indexes + [index] 
      result.append(current_index + [item.index(word)]) 
     except ValueError: 
      pass 
     print item 
     print str(current_index) + ":::::" + str(list.index(item)) 
     for stuff in item:   
      if type(stuff) == type([]): 
       flag =1 

    if flag==1: 
     indexes.append(index) 
     result.extend(scope2(word, item, copy(indexes))) 

return result 

这里的问题是兄弟姐妹(列表在同一级别)的索引也得到了返回,但并不总是。一些示例输出如

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等等。什么可能是可能的问题?

+0

'lis [0] [2] [3] [1]'''''leaf 3']'。 'lis [0] [2] [2] [1] [0]'是'span 1 2''。 – falsetru 2014-09-19 10:28:57

+0

@falsetru抱歉,它只是lis [0] [2] [2] [1] [0]。在问题中编辑 – 2014-09-19 11:00:04

回答

2
>>> 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) 
>>> 
1

这里是深度优先和宽度优先搜索的实现,不限于字符串。需要一点点修改才能搜索列表或元组。

>>> 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] 
相关问题