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

时间:2015-10-08 07:10:56

标签: python-3.x tuples

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

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

这用于montecarlo siulation以检查7张牌扑克牌是否包含直线。

2 个答案:

答案 0 :(得分:1)

假设一个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))  

答案 1 :(得分:0)

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

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),它尽可能好,因为你必须检查每个数字。