2013-07-25 59 views
7

結束的子表的索引我有一個列表:查找開始,在列表

greeting = ['hello','my','name','is','bob','how','are','you'] 

我想定義一個函數,會發現在這個列表中的子列表的第一個和最後一個索引。因此:

find_sub_list(['my','name','is'], greeting) 

應該返回:

1, 3 

建議?

+1

將列表中的項目始終是連續的? '['我的','是','如何']也是一個可接受的輸入嗎?如果這返回'[1,5]' – misguided

回答

4

如果你想多場比賽,這個工程:

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is'] 

def find_sub_list(sl,l): 
    results=[] 
    sll=len(sl) 
    for ind in (i for i,e in enumerate(l) if e==sl[0]): 
     if l[ind:ind+sll]==sl: 
      results.append((ind,ind+sll-1)) 

    return results 

print find_sub_list(['my','name','is'], greeting) 
# [(1, 3), (8, 10)] 

或者,如果你只是想第一場比賽:

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is'] 

def find_sub_list(sl,l): 
    sll=len(sl) 
    for ind in (i for i,e in enumerate(l) if e==sl[0]): 
     if l[ind:ind+sll]==sl: 
      return ind,ind+sll-1 

print find_sub_list(['my','name','is'], greeting)  
# (1, 3) 
0

片名單:

>>> greeting[0:3] 
['hello', 'my', 'name'] 
>>> greeting[1:4] 
['my', 'name', 'is'] 
>>> greeting[1:4] == ['my','name','is'] 
True 

這應該讓你開始:

for n in range(len(greeting) - len(sub_list) + 1): 
    ... 
1

如果你確定你的名單總是會在你的子表,你可以這樣做:

def find_sub_list(sub_list,this_list): 
    return (this_list.index(sub_list[0]),len(sub_list)) 

如果你想入住在子列表中的項目列表中的存在,那麼使用:

def find_sub_list(sub_list,this_list): 
    if set(sub_list).issubset(set(this_list)): 
     return(this_list.index(sub_list[0]),len(sub_list)) 
    else: 
     return False 

最後,如果在SUB_LIST項目的順序也將是未知的,然後使用此:

def find_sub_list(sub_list,this_list): 
    if sub_list[0] in this_list: 
     for i,item in enumerate(sub_list[1:]): 
      if item not in this_list[this_list.index(sub_list[i]):]: 
       return False 
     return(this_list.index(sub_list[0]),len(sub_list)) 

現在,這些項目必須按照正確的順序排列,才能使函數不返回false。

0

以下是如果要返回只有第一個和最後一個條目的索引的解決方案:

def find_sub_list(subl, l): 
    ind_subl = [i for i in range(len(l)) if l[i] in subl] 
    return [ind_subl[0], ind_subl[-1]] 

print find_sub_list(['my', 'name', 'is'], greeting) 
# [1, 3]