检查一个元组中至少有 5 个连续的数字

Check a tuple for at least 5 consecutive numbers

我有一个元组 A,我想检查它是否至少包含 5 个连续的数字。最省时的方法是什么?

A= (1, 4, 5, 6, 7, 8, 12) --> 真

这用于 montecarlo siulation 以检查 7 张扑克手是否包含顺子。

假设一个由 7 个不同整数组成的排序元组。如果有 5 个整数串联,即 (n, n+1, n+2, n+3, n+4),它们必须分别从位置 0、1 或 2 开始,到位置 4、5 或 6 结束.

straight = any(a[4+i] - a[i] == 4 for i in (0,1,2))

更新:如果序列长度不固定: (由 tobias_k 在评论中建议)

straight = any(a[4+i] - a[i] == 4 for i in range(len(a)-4))  

我不认为有一个简单的单行代码,但你基本上只需要循环列表中的元素并检查它是否比最后一个多一个,如果 return True 运行 计数达到 5。您还必须考虑有两张卡具有相同值的情况。

def has_straight(values, req=5):
    last = count = None
    for x in values:
        if x - 1 == last:
            count += 1  # one more on the straight
        elif x == last:
            pass        # same value as before
        else:
            count = 1   # start a new straight
        if count >= req:
            return True
        last = x
    return False

一些示例:

has_straight((1, 4, 5, 6, 7, 10, 12))  # no straight -> False
has_straight((1, 4, 5, 6, 7, 8, 12))   # straight in middle -> True
has_straight((1, 2, 3, 4, 5, 10, 12))  # at beginning -> True
has_straight((1, 2, 8, 9, 10, 11, 12)) # at very end -> True
has_straight((1, 2, 2, 3, 4, 4, 5))    # straight with dupes -> True

复杂度为 O(n),这已经是最好的了,因为您必须检查每个数字。