Python 在列表中查找匹配的项目序列

Python 在列表中查找匹配的项目序列,python,list,Python,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清单a,B: n=莉娜 对于范围为B-n+1的i,返回anyA==B

以下是测试列表:

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清单a,B: n=莉娜 对于范围为B-n+1的i,返回anyA==B[i:i+n] 实例 测试列表=[0,1,2,3,4,5,6,7,8,9] 列表包含[1,2,3],测试列表为真 列表包含[4,5,8],测试列表错误 def列表包含A、B: n=莉娜 对于范围为B-n+1的i,返回anyA==B[i:i+n] 实例 测试列表=[0,1,2,3,4,5,6,7,8,9] 列表包含[1,2,3],测试列表为真 列表包含[4,5,8],测试列表错误 您可以使用一起迭代3个连续元素,并使用检查是否有任何匹配项为真。例如:

>>> 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
有关更多详细信息,请参阅以下文档:

您可以使用一起迭代3个连续元素,并使用检查是否有任何匹配项为真。例如:

>>> 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
有关更多详细信息,请参阅以下文档:


您可以使用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]、,。。。它将与长度透镜的每个子列表形成元组

如果不想使用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")

虽然这对数值有效,但如果值是可能包含任何模式(包括序列的字符串版本)的字符串,则仍可能失败。

您可以使用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")
使用参数unpacking*…可为zip提供与S中元素数量相同的子列表。这些子列表中的每一个子列表都从不同的偏移量开始,因此zip将接收到L[0]、L[1]、L[2],…这将与长度透镜的每个子列表形成元组

如果不想使用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")

虽然这对数值有效,但如果值是可能包含任何模式(包括序列的字符串版本)的字符串,则仍可能失败。

出于好奇,我运行了一个小的性能比较,以查看对于超过100万个数字的较大列表,哪一个更快。结果如下:

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

出于好奇,我运行了一个小的性能比较,看看对于超过100万个数字的较大列表,哪一个更快。以下是结果:

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 containssarr,sseq: 在sarr中返回sseq arr=[1,2,3,4,4,5,7,8] seq=[1,2,3] printcontains.joinmapstr,arr,.joinmapstr,seq 这样做:

def containssarr,sseq: 在sarr中返回sseq arr=[1,2,3,4,4,5,7,8] seq=[1,2,3] printcontains.joinmapstr,arr,.joinmapstr,seq
你想分享你的代码吗?你认为哪里需要改进?我们可以将列表转换成字符串并搜索substr,KMP算法来拯救!在Python中有意义你想分享你的代码吗?你认为哪里需要改进?我们可以将列表转换成字符串并搜索substr,KMP算法来拯救rescue!在pythonnie中很有意义。是否可以扩展它以找到任何连续数字的“对”?是的,您可以这样做:anyx==mynum for x in zip*myu list[i:]对于rangelenmy_num中的i。但这不值得。如果元组长度是动态的,Aven的答案是更好的。是否可以扩展它以找到任何连续数字的“对”?是的,您可以这样做anyx==my_num for x in zip*my_list[i:]对于rangelenmy_num中的我来说。但这不值得。如果元组长度是动态的,Aven的答案是更好的,任何元组都是方便和强大的!任何元组都是方便和强大的!只需将其与@Aven进行简单的性能比较,就会发现这要快得多:想知道是什么因素造成的。我认为这可能是因为字符串接近r与在循环中执行Python代码(包括为子集生成列表/元组)的其他代码不同,大多数工作都依赖于低级代码。顺便说一句,我更改了字符串策略条件,前一个缺少封闭括号
在this和@Aven之间运行一个简单的性能比较,发现这要快得多:想知道是什么原因造成的。我认为这可能是因为string方法在大多数工作中依赖于低级代码,而不是在循环中执行Python代码的其他方法,包括为子集生成列表/元组。顺便说一句,我更改了字符串策略条件,前一个字符串缺少括号