2013-07-25 12 views
7

Ho una lista:Trova inizio e fine indici di sottolista in lista

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

voglio definire una funzione che trova il primo e ultimo indice di un elenco secondario in questo elenco. Così:

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

dovrebbe restituire:

1, 3 

Suggerimenti?

+1

avrebbe le voci di elenco sempre consecutivi? '['Mio', 'è', 'come']' anche un input accetabile? Dovrebbe questo restituire '[1,5]' – misguided

risposta

4

Se si desidera più corrispondenze, questo funziona:

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

O se volete solo il Prima partita:

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

fetta della lista:

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

Questo dovrebbe ottenere il vostro iniziare:

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

Se sei sicuro che l'elenco sarà sempre nel vostro elenco secondario si può solo fare:

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

Se vuoi essere il controllo degli elementi nella sottolista esiste nella lista quindi utilizzare:

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 

Infine, se l'ordine degli elementi nella sub_list è anche andare a essere sconosciuto quindi utilizzare questo:

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

Ora, gli elementi devono essere nel giusto ordine perché la funzione non restituisca false.

0

seguito è una soluzione solo se gli indici della prima e l'ultima voce sono da restituire:

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] 
Problemi correlati