2013-07-25 16 views
7

Mam listę:Znajdź rozpoczęcia i zakończenia wskaźników podmenu w liście

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

Chcę zdefiniować funkcję, która znajdzie pierwszy i ostatni indeks podmenu w tym liście. Zatem:

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

powinien zwrócić:

1, 3 

sugestie?

+1

by elementy lista zawsze będzie kolejny? Czy '['my', 'is', 'how']' będzie również wprowadzeniem danych wejściowych? Powinno to zwrócić '[1,5]' – misguided

Odpowiedz

4

Jeśli chcesz wiele odpowiedników, to działa:

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

lub jeśli po prostu chcesz pierwszy mecz:

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

Kawałek lista:

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

ten powinien dostać swoją początek:

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

Jeśli masz pewność, że lista zawsze będzie w podmenu można po prostu zrobić:

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

Jeśli chcesz być sprawdzania pozycji w podmenu istnieje na liście, a następnie użyć:

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 

Wreszcie, jeśli kolejność elementów w sub_list też będzie wiadomo następnie użyj:

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

Teraz elementy muszą być we właściwej kolejności, aby funkcja nie zwróciła fałszu.

0

Poniżej znajduje się rozwiązanie, jeśli mają być zwracane tylko indeksy pierwszego i ostatniego wpisu:

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]