我在检查排序列表中是否存在序列时遇到了一些问题。例如,如果我的列表是
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个数字的序列号的提示。感谢
答案 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循环来使(可能)更快。但是,你必须每次迭代检查长度。