如何解决如何检查具有 6 个项目的列表中是否有 3 或 4 或 5 个连续数字?
如何检查有 6 个项目的列表中是否有 3 个或 4 个或 5 个或 6 个连续的数字?
我正在使用 python
。
我试图生成数字 1-42 的组合。我有 500 万种以上的组合。我试图通过删除具有 3-6 个连续数字的组合来减少组合数量。
给定列表:
(5,8,12,28,29,30) has 3 consecutive
(1,9,10,11,23) has 4 consecutive
(2,13,14,15,16) has 5 consecutive
(3,4,5,6,7,8) has 6 consecutive
(3,21) has 2 consecutive
(2,21,34)
(3,34)
通过删除具有 3-6 个连续数字的列表,输出应为:
(3,21)
(2,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,9,10,11,23))
Out[88]: 4
In [89]: maxRunSize((2,13,14,16))
Out[89]: 3
In [90]: maxRunSize((2,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)))
,
如果所有序列都有严格递增顺序的 6 个数字,您可以使用快速简单的测试:
if any(x[i]+2 == x[i+2] for i in range(4)):
# ... remove x ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。