我有一个元组A,我想检查它是否包含至少5个连续数字。什么是最有效的方法呢?
A =(1,4,5,6,7,8,12) - > TRUE
这用于montecarlo siulation以检查7张牌扑克牌是否包含直线。
答案 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),它尽可能好,因为你必须检查每个数字。