【问题标题】:How to check if there are 3 or 4 or 5 consecutive numbers in a list with 6 items?如何检查包含 6 个项目的列表中是否有 3 个或 4 个或 5 个连续数字?
【发布时间】:2021-03-21 05:32:12
【问题描述】:

如何检查一个包含6个项目的列表中是否有3个或4个或5个或6个连续数字?

我正在使用python。 我试图生成数字 1-42 的组合。我有超过 500 万种组合。我正在尝试通过删除具有 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)

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: python list numbers items


【解决方案1】:

这是您的要求:

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)))

【讨论】:

  • 这似乎有效。我只会得到具有 3-6 个连续数字的那些,然后将其删除。输出剩余的列表。你能解释一下代码吗?这对我来说是一个新的学习。非常感谢。
  • 代码生成并产生大小k(在您的情况下为6)的组合。然而,当它生成一个可行的组合时,它看起来是最后一个 window-1 元素并检查它们是否形成有效的运行。如果是这样,它生成的下一个数字仍在区间 [1,n] 内,但不包括将继续运行的一个数字
【解决方案2】:

如果所有序列恰好有 6 个严格递增的数字,您可以使用快速简单的测试:

if any(x[i]+2 == x[i+2] for i in range(4)):
    # ... remove x ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多