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代码的其他方法,包括为子集生成列表/元组。顺便说一句,我更改了字符串策略条件,前一个字符串缺少括号