Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果找到数字序列,则Python拆分列表_Python_List - Fatal编程技术网

如果找到数字序列,则Python拆分列表

如果找到数字序列,则Python拆分列表,python,list,Python,List,我一直在试图找到一个相关的问题,尽管我似乎找不到合适的词,我所发现的只是如何检查列表是否包含交叉点 基本上,我需要在找到某个数字序列后拆分一个列表,类似于执行str.split(sequence)[0],而是使用列表。我有工作代码,虽然它看起来不是很有效(也不知道引发错误是否是正确的方法),我相信一定有更好的方法来做 作为记录,long_list可能有几百万个值,这就是为什么我认为遍历它们可能不是最好的主意 long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,2

我一直在试图找到一个相关的问题,尽管我似乎找不到合适的词,我所发现的只是如何检查列表是否包含交叉点

基本上,我需要在找到某个数字序列后拆分一个列表,类似于执行
str.split(sequence)[0]
,而是使用列表。我有工作代码,虽然它看起来不是很有效(也不知道引发错误是否是正确的方法),我相信一定有更好的方法来做

作为记录,
long_list
可能有几百万个值,这就是为什么我认为遍历它们可能不是最好的主意

long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
end_marker = [6,43,23,95]
end_marker_len = len(end_marker)

class SuccessfulTruncate(Exception):
    pass
try:
    counter = 0
    for i in range(len(long_list)):
        if long_list[i] == end_marker[counter]:
            counter += 1
        else:
            counter = 0
        if counter == end_marker_len:
            raise SuccessfulTruncate()
except SuccessfulTruncate:
    long_list = long_list[:2 + i - end_marker_len]
else:
    raise IndexError('sequence not found')

>>> long_list
[2,6,4,2,7,98,32,5,15,4,2]
好的,用100万个值的大列表计时几个答案(标记非常接近末尾):

我有工作代码,虽然它看起来不是很有效(也不知道引发错误是否是正确的方法),我相信一定有更好的方法来做

我在评论中对提出的例外情况发表了评论


如果计数器==end\u marker\u len:long\u list=long\u list[:2+i-end\u marker\u len],您可以省略try/except并执行
,而不是引发异常并在同一try/except中捕获它。Successful这个词不适合用作异常名称。异常用于指示某个操作失败

无论如何,这里有一个较短的方法:

>>> long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
>>> end_marker = [6,43,23,95]
>>> index = [i for i in range(len(long_list)) if long_list[i:i+len(end_marker)] == end_marker][0]
>>> long_list[:index]
[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]
列表理解灵感来自post

我有工作代码,虽然它看起来不是很有效(也不知道引发错误是否是正确的方法),我相信一定有更好的方法来做

我在评论中对提出的例外情况发表了评论


如果计数器==end\u marker\u len:long\u list=long\u list[:2+i-end\u marker\u len]
,您可以省略try/except并执行
,而不是引发异常并在同一try/except中捕获它。Successful这个词不适合用作异常名称。异常用于指示某个操作失败

无论如何,这里有一个较短的方法:

>>> long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
>>> end_marker = [6,43,23,95]
>>> index = [i for i in range(len(long_list)) if long_list[i:i+len(end_marker)] == end_marker][0]
>>> long_list[:index]
[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]

列表理解的灵感来自post

,作为一种更具python风格的方式,而不是多重切片,您可以在列表理解中使用
itertools.islice

>>> from itertools import islice
>>> M,N=len(long_list),len(end_maker)
>>> long_list[:next((i for i in range(0,M) if list(islice(long_list,i,i+N))==end_marker),0)]
[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]

请注意,由于
next
函数的默认值为0,如果未找到任何匹配项,它将返回整个
long_list

,作为一种更具python风格的方式,而不是多个切片,因此您可以在列表中使用
itertools.islice

>>> from itertools import islice
>>> M,N=len(long_list),len(end_maker)
>>> long_list[:next((i for i in range(0,M) if list(islice(long_list,i,i+N))==end_marker),0)]
[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]

请注意,由于
next
函数的默认值为0,如果未找到任何匹配项,它将返回整个
long_list

,如果值的范围有限,例如fit in bytes(这也可以适应更大的类型),那么为什么不对列表进行编码,以便可以使用字符串方法
find

long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
end_marker = [6,43,23,95]

import struct

long_list_p = struct.pack('B'*len(long_list), *long_list)
end_marker_p = struct.pack('B'*len(end_marker), *end_marker)

print long_list[:long_list_p.find(end_marker_p)]
印刷品:

[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]
我尝试像中一样使用
字节
,但它们的查找方法不起作用:

print long_list[:bytes(long_list).find(bytes(end_marker))]

如果值的范围有限,比如以字节为单位的fit(这也可以适用于更大的类型),那么为什么不对列表进行编码,以便可以使用string方法
find

long_list = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
end_marker = [6,43,23,95]

import struct

long_list_p = struct.pack('B'*len(long_list), *long_list)
end_marker_p = struct.pack('B'*len(end_marker), *end_marker)

print long_list[:long_list_p.find(end_marker_p)]
印刷品:

[2, 6, 4, 2, 7, 98, 32, 5, 15, 4, 2]
我尝试像中一样使用
字节
,但它们的查找方法不起作用:

print long_list[:bytes(long_list).find(bytes(end_marker))]

在我的解决方案中,使用了带有
索引的方法
方法:

input = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
brk = [6,43,23,95]
brk_len = len(brk)
brk_idx = 0
brk_offset = brk_idx + brk_len

try:
    while input[brk_idx:brk_offset] != brk:
        brk_idx = input.index(brk[0], brk_idx + 1)
        brk_offset = brk_idx + brk_len
except ValueError: 
    print("Not found")
else:
    print(input[:brk_idx])

在我的解决方案中,使用了带有
索引的方法
方法:

input = [2,6,4,2,7,98,32,5,15,4,2,6,43,23,95,10,31,5,1,73]
brk = [6,43,23,95]
brk_len = len(brk)
brk_idx = 0
brk_offset = brk_idx + brk_len

try:
    while input[brk_idx:brk_offset] != brk:
        brk_idx = input.index(brk[0], brk_idx + 1)
        brk_offset = brk_idx + brk_len
except ValueError: 
    print("Not found")
else:
    print(input[:brk_idx])


如果计数器==end\u marker\u len:long\u list=long\u list[:2+i-end\u marker\u len]
,您可以省略try/except并执行
,而不是引发异常并在同一try/except中捕获它。Successful这个词不适合用作异常名称。异常用于指示某些内容失败,而不是在同一个try/except中引发异常并捕获它。如果计数器==end\u marker\u len:long\u list=long\u list[:2+i-end\u marker\u len]
,则可以省略try/except并执行
。Successful这个词不适合用作异常名称。例外是用来表示某些事情失败的。谢谢,这是一个更好的解决方法。哈哈。我还想看看你的,我可能会找到第一个数字所在的所有索引,并且只从这些索引开始检查:)谢谢,这是一个更好的方法哈哈。我还想看看你的,我可能会找到第一个数字所在的所有索引,并且只从这些索引开始检查:)谢谢,那样很好,虽然我只是计时,但不幸的是,它需要大约两倍于Tims答案的时间:P@Peter对于像这样的小列表,你是对的,但是对于大列表,我的答案会表现得更好。好吧,现在要测试一个大列表。嗯,它不能很好地处理大列表,已经走了一分钟了,但还没有完成啊哈。谢谢,那条路很好,虽然我只是计时,但不幸的是,它需要大约两倍于Tims回答的时间:P@Peter对于像这样的小列表,你是对的,但是对于较大的列表,我的答案会表现得更好。好的,现在要测试一个较大的列表。嗯,它不能很好地处理更大的列表,已经进行了一分钟,但仍然没有完成啊哈。太棒了,谢谢,这是迄今为止最快的一个,我将在一个很长的列表上试一试,看看它是否仍然有效:)太棒了,谢谢,这是迄今为止最快的一个,我将在一个很长的列表中试一试,看看它是否仍然有效:)@Peter既然你的列表中可以有数百万个项目,我理解在这种情况下可能是这样,但请记住,速度通常不如简短、易懂的代码重要。是的,我明白你的意思,我通常会选择更短、更好看的东西,但这是代码中处理量最大的部分之一,所以我也需要速度:)@Peter因为你的列表中可以有数百万个项目,我知道在这种情况下可能是这样,但请记住