2015-10-18 63 views
1

我是在扑克模拟器,并试图确定这将确定一条直线,并给它的5检查,连续5号

def straightCheck(playerHand): 
    playerHand.sort() 
    print(playerHand) 
    for playerHand in range(len(playerHand)): 
     for i in playerHand: 
      if playerHand[i] == playerHand [i+1] -1: 
       straight = True 
      else: 
       straight = False 
    if straight == True: 
     handstrength = 5 

x = [1,3,5,4,2] 
straightCheck(x) 

一个handstrength值我想不出一个功能的阵列什么是错误的是,但它不断返回此错误消息:

for i in playerHand: 
TypeError: 'int' object is not iterable 
+5

您正在用第一个for循环中的整数替换可能包含该手的playerhand参数。尝试重命名该迭代器 –

+1

您正在遍历不可迭代的整数对象。如果要检测长度为5的连续序列,最好使用'itertools.groupby'函数。 – Kasramvd

回答

2

首先您要遍历一个整数的,不能(也不应该)来完成。看起来你的两个嵌套for循环应该只是一个for,如for i in range(len(playerHand) - 1),当使用-1时,以便您不要尝试访问playerHand[len(playerHand)]

此外,由于您在每次迭代中将straight设置为TrueFalse,因此只有最后一次迭代才会计数,因此您会得到误报。

最后,我不确定您是否希望您的函数为return a值,但目前您的函数returns没有数据(除非handstrength是全局变量)。此外,请注意,目前,通过使用.sort(),您实际上正在对playerHand进行排序,从而在功能范围内对其进行了更改 - 这可能不是您想要的。

一个可能的函数来检查是否有手是直的,类似于你的代码,是这样的:

def is_straight(playerHand): 
    playerHand.sort() 
    for i in range(len(playerHand) - 1): 
     if playerHand[i] != playerHand [i+1] - 1: 
      return False 
    return True 

该函数返回True如果playerHand是直的,并且False否则。

+0

对输入参数进行排序可能不是一个好习惯,因为该对象最终会结束在可能不是用户期望的功能之外进行更改。用'playerHand = sorted(playerHand)'代替'playerHand.sort()'将使得列表仅在函数的范围内排序。 – SethMMorton

+0

你是对的,但我试图展示OP如何将他的代码转换成可用的代码。我不确定他是否想要更改原始列表,但这是他原来的做法。 – dorverbin

+1

基于原始错误的性质,我认为OP在这一点上不知道这种类型的错误。我只是想添加一些额外的帮助,因为他们似乎是一个新的程序员。 – SethMMorton

0

这是怎么回事。您对列表进行排序,然后将其转换为一个集合并返回到列表,这使得它是唯一的。那么长度必须是5,如果是这样,5个连续数字的最大值和最小值之间的差值必须是4.我不能在这里数学证明这一点,但它应该是。 ;)

>>> x=[2,1,5,3,4] 
>>> y=sorted(x) 
>>> y=list(set(y)) 
>>> if len(y) == 5 and y[4]-y[0] == 4: 
...  print "straight" 
... 
straight 

这里也看到这一点:Check for consecutive numbers

+0

但2,3,4,5,6应该是直的,不是吗? – DSM

+0

哦,大概,你是对的。我不是那个pokerface。所以,你需要连续五次......在这种情况下,y [4] -y [0]应该总是返回4. – ferdy