結束的子表的索引我有一個列表:查找開始,在列表
greeting = ['hello','my','name','is','bob','how','are','you']
我想定義一個函數,會發現在這個列表中的子列表的第一個和最後一個索引。因此:
find_sub_list(['my','name','is'], greeting)
應該返回:
1, 3
建議?
結束的子表的索引我有一個列表:查找開始,在列表
greeting = ['hello','my','name','is','bob','how','are','you']
我想定義一個函數,會發現在這個列表中的子列表的第一個和最後一個索引。因此:
find_sub_list(['my','name','is'], greeting)
應該返回:
1, 3
建議?
如果你想多場比賽,這個工程:
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)
片名單:
>>> 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):
...
如果你確定你的名單總是會在你的子表,你可以這樣做:
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。
以下是如果要返回只有第一個和最後一個條目的索引的解決方案:
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]
將列表中的項目始終是連續的? '['我的','是','如何']也是一個可接受的輸入嗎?如果這返回'[1,5]' – misguided