Python 如何检查包含6项的列表中是否有3、4或5个连续数字?
如何检查包含6项的列表中是否有3或4或5或6个连续数字 我正在使用Python 如何检查包含6项的列表中是否有3、4或5个连续数字?,python,list,numbers,items,Python,List,Numbers,Items,如何检查包含6项的列表中是否有3或4或5或6个连续数字 我正在使用python。 我尝试生成数字1-42的组合。我有5百万以上的组合。我试图通过删除具有3-6个连续数字的组合来减少组合的数量 给定列表: (5,8,12,28,29,30) has 3 consecutive (1,8,9,10,11,23) has 4 consecutive (2,12,13,14,15,16) has 5 consecutive (3,4,5,6,7,8) has 6 consecutive (3,9
python
。
我尝试生成数字1-42的组合。我有5百万以上的组合。我试图通过删除具有3-6个连续数字的组合来减少组合的数量
给定列表:
(5,8,12,28,29,30) has 3 consecutive
(1,8,9,10,11,23) has 4 consecutive
(2,12,13,14,15,16) has 5 consecutive
(3,4,5,6,7,8) has 6 consecutive
(3,9,11,14,15,21) has 2 consecutive
(2,5,7,12,21,34)
(3,5,8,10,12,34)
通过删除具有3-6个连续数字的列表,输出应为:
(3,9,11,14,15,21)
(2,5,7,12,21,34)
(3,5,8,10,12,34)
以下是您的要求:
import itertools
def maxRunSize(t):
return 1+max(len(tuple(g)) if k else 0 for k,g in itertools.groupby(zip(t, t[1:]), key=lambda t: t[1]-t[0]==1))
输出:
In [87]: maxRunSize((5,8,12,28,29,30))
Out[87]: 3
In [88]: maxRunSize((1,8,9,10,11,23))
Out[88]: 4
In [89]: maxRunSize((2,12,13,14,14,16))
Out[89]: 3
In [90]: maxRunSize((2,12,13,14,15,16))
Out[90]: 5
In [91]: maxRunSize((3,4,5,6,7,8))
Out[91]: 6
但是,如果您希望只生成没有长时间运行的组合(这样以后就不必过滤它们),请查看以下内容:
import random
def generate(n, k, window):
"""
Generate n-choose-k combinations in [1,n] such that there is no window-length of consecutive numbers
"""
answer = []
while True:
if len(answer) >= window:
if answer[-window:] == list(range(answer[-window], window+1)):
answer = []
elif len(answer) == k:
yield answer
answer = []
elif len(answer) == window-1:
if answer[1-window:] == list(range(answer[1-window], window)):
answer.append(random.choice([i for i in range(1,n+1) if i!=answer[-1]+1]))
else:
answer.append(random.choice(range(1,n+1)))
如果所有sequnce都有6个严格递增的数字,您可以使用一个快速简单的测试:
if any(x[i]+2 == x[i+2] for i in range(4)):
# ... remove x ...
到目前为止你都试了些什么?这似乎有效。我只需要得到3-6个连续数字,然后删除它。输出剩余的列表。你能解释一下密码吗?这对我来说是一门新的学问。非常感谢。代码生成并生成大小为
k
(在您的示例中为6)的组合。但是,当它生成一个可行的组合时,它会将其视为最后一个window-1
元素,并检查它们是否构成有效的运行。如果是,它生成的下一个数字仍在间隔[1,n]内,但不包括将继续运行的数字