2013-07-25 26 views
7

Tôi có một danh sách:Tìm bắt đầu và kết thúc chỉ số của sublist trong danh sách

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

Tôi muốn xác định một chức năng mà sẽ tìm index đầu tiên và cuối cùng của danh sách phụ chứa trong danh sách này. Như vậy:

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

nên quay lại:

1, 3 

Gợi ý?

+1

sẽ danh sách các mục luôn được liên tục? Liệu '['my', 'is', 'how']' có phải là một đầu vào có thể đọc được không? Nên sự trở lại này '[1,5] ' – misguided

Trả lời

4

Nếu bạn muốn nhiều trận đấu, công trình này:

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

Hoặc nếu bạn chỉ muốn khớp đầu tiên:

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

Slice danh sách:

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

này nên bắt đầu của bạn:

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

Nếu bạn chắc chắn rằng danh sách của bạn sẽ luôn luôn được trong sublist của bạn, bạn có thể chỉ cần làm:

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

Nếu bạn muốn được kiểm tra các mục trong danh sách phụ chứa tồn tại trong danh sách sau đó sử dụng:

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 

Cuối cùng, nếu thứ tự của các mục trong sub_list cũng sẽ là không rõ sau đó sử dụng này:

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

Bây giờ, các mục phải theo thứ tự đúng cho hàm không trả về false.

0

Sau đây là một giải pháp nếu chỉ có chỉ số những người đầu tiên và mục cuối cùng là để được trả lại:

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] 
Các vấn đề liên quan