[英]Find matching sequence of items in a list
這是一個測試列表:
test_list = [0,1,2,3,4,5,6,7,8,9]
如何檢查此列表是否按此順序准確包含那些值 1、2、3(值之間沒有任何內容)?
在這個例子中,[0,1,2,3,4,5,6,7,8,9] 包含 '1,2,3' 但不包含 '4,5,8' 因為之間有項目5 和 8 都不是“3,2,1”,因為它們不是按這個順序排列的。
我想這個問題很容易解決,但我找不到一個好的和快速的方法來解決它......拜托,你能給我一些線索嗎? 親切地
def list_contains(A, B):
n = len(A)
return any(A == B[i:i + n] for i in range(len(B)-n + 1))
#Example
test_list = [0,1,2,3,4,5,6,7,8,9]
list_contains([1,2,3], test_list) # True
list_contains([4,5,8], test_list) # False
您可以使用 zip 形成子集並檢查您的序列是否存在於其中。
這是一種通用的方法:
L = [0,1,2,3,4,5,6,7,8,9]
S = [1,2,3]
if tuple(S) in zip(*(L[i:] for i in range(len(S)))):
print("found")
else:
print("not found")
使用參數解包*(...
為 zip 提供與S
中的元素一樣多的子列表。這些子列表中的每一個都以不同的偏移量開始,因此 zip 將收到 L[0:],L[1:],L[2 :],... 這將與長度為len(S)
的每個子列表形成元組。
如果您不想使用 zip(),可以使用索引來形成子集:
if S in (L[i:i+len(S)] for i in range(len(L))):
print("found")
else:
print("not found")
字符串策略要求分隔符避免越界(例如在“11,2,31”中找不到“1,2,3”)。 這可以通過使用“][”作為分隔符來實現,以便所有值都以相同的方式括起來(“[11][2][31]”中的“[1][2][3]”):
if str(S).replace(", ","][") in str(L).replace(", ","]["):
print("found")
else:
print("not found")
雖然這適用於數值,但如果值是字符串(可能包含任何模式,包括序列的字符串版本),它仍然會失敗。
只是出於好奇,我進行了一個小的性能比較,看看哪個對於更大的列表(超過 1+ 百萬個數字)更快。 結果如下:
import time
def list_contains(S, L):
''' check if S in in L - list of integers'''
n = len(S)
return any(S == L[i:i + n] for i in range(len(L)-n + 1))
# @AlainT version
def list_in_list(S, L):
if tuple(S) in zip(*(L[i:] for i in range(len(S)))):
return f'True'
return f'False'
if __name__ == '__main__':
test_list = L = list(range(1, 1_000_000))
start_time = time.time()
S = [567_899, 567_900, 567_901]
list_contains(S, L) # 0.1557 ** use any(..) from @Anoymous's got almost same results
#list_in_list(S, L) # 0.0528
print('....%s seconds', (time.time() - start_time))
做這個:
def contains(sarr,sseq):
return sseq in sarr
arr = [1,2,3,4,4,5,7,8]
seq = [1,2,3]
print(contains(''.join(map(str, arr)),''.join(map(str, seq))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.