簡體   English   中英

在列表中查找匹配的項目序列

[英]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”,因為它們不是按這個順序排列的。

我想這個問題很容易解決,但我找不到一個好的和快速的方法來解決它......拜托,你能給我一些線索嗎? 親切地

您可以使用zip()一起迭代 3 個連續元素,並使用any()檢查任何匹配項是否為True 例如:

>>> my_list = [0,1,2,3,4,5,6,7,8,9]
>>> my_num = (1, 2, 3)

>>> any(x== my_num for x in zip(my_list, my_list[1:], my_list[2:]))
True

有關詳細信息,請參閱以下文檔:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM