如何检查排序列表中序列的存在?

时间:2014-04-07 21:44:10

标签: python list

我在检查排序列表中是否存在序列时遇到了一些问题。例如,如果我的列表是

n=[1,2,3,4,5,6,7]

我可以将我的代码编写为:

for i in range(1,len(n)):
    if n[i]==n[0]+1:
        print('yes')

但是,如果我一次检查5个数字,这个逻辑就会失败。例如,如果我的列表是

n=[1,3,4,5,6,7,8]

我的序列不包含前5个数字,但它肯定存在于列表中。 我想知道是否有人可以给我一些关于如何一次检查5个数字的序列号的提示。感谢

3 个答案:

答案 0 :(得分:1)

您可以使用Python2.6' itertools页面中的此配方:

from itertools import groupby
from operator import itemgetter

data = [ 1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28,29]
# Find runs of consecutive numbers using groupby.  The key to the solution
# is differencing with a range so that consecutive numbers all appear in
# same group.
for k, g in groupby(enumerate(data), lambda x: x[0]-x[1]):
    seq = list(map(itemgetter(1), g))
    # if you don't want the actual items then:
    # sum(1 for _ in g) >= 5: print('yes') 
    if len(seq) >= 5:
        print (seq)

<强>输出:

[25, 26, 27, 28, 29]

答案 1 :(得分:0)

search_target = [1,2,3,4]
search_space = range(1000)
sub_size = len(search_target)
lists = [search_space[i:i+sub_size] for i in range(len(search_space)-sub_size)]
if search_target in lists:
   print "YUP"

答案 2 :(得分:0)

我不确定这是否是您想要的方法,但使用缓冲区可以正常工作。

这个想法是你将遍历你的数组/列表并收集数字(按顺序),直到你遇到一个非顺序的数据,你将把内容转储到缓冲区并继续。如果缓冲区末尾包含足够的数字,那么就有序列。

这样你只需要迭代列表一次,只需要迭代O(n)。

def check_for_sequence(array, length):
    buf = []
    for n in array:
        if buf == [] or (buf[-1] + 1 == n):
            buf.append(n)
        else:
            buf = [n]

    if len(buf) >= length:
        print buf[:length]
    else:
        print "No sequence of length %s" % length

您还可以通过在缓冲区达到所需长度后立即终止for循环来使(可能)更快。但是,你必须每次迭代检查长度。