我想为我的函数调用元组元组中的元素

时间:2013-03-07 14:38:06

标签: python

当tictactoe游戏的其中一行已满时我想成真:

teste5=('O','X','X',' ',' ',' ',' ',' ',' ')
teste6=('X','X','X',' ',' ',' ',' ',' ',' ')

def vencedor_linha(t):
    tl1=(t[0],t[1],t[2])
    tl2=(t[3],t[4],t[5])
    tl3=(t[6],t[7],t[8])
    tl=(tl1,tl2,tl3)
    if tl[0:][0:]=='X':
        return True
    elif tl[0:][0:]=='O':
        return True
    else:
        return False

所以vencedor_linha(teste5) - > True和    vencedor_linha(teste6) - > False

问题是:它给了我vencedor_linha(teste5) - > False,因为我无法使if正常工作。

PS。我不能使用列表所以不要打扰告诉我。 :P

2 个答案:

答案 0 :(得分:1)

如果要检查3个不同的值是否等于某个值,则需要使用all()或3个不同的==条件;检查切片是否等于一个值没有任何意义。

你想要这样的东西:

def vencedor_linha(t):
    tl1=(t[0],t[1],t[2])
    tl2=(t[3],t[4],t[5])
    tl3=(t[6],t[7],t[8])
    tl=(tl1,tl2,tl3)
    for row in tl:
        if all(x == 'X' for x in row) or all(x == 'O' for x in row):
            return True
    return False

(这会检查所有3行;我不清楚您的原始代码是否只是尝试检查第一行。)

答案 1 :(得分:0)

一个使用itertools的内衬,就像使用iterables做一些聪明的东西一样:

from itertools import groupby
def vencedor_linha(t):
    return any(reduce(lambda x,y:x if x==y and x in ['X','Y'] else False,
        (r[1] for r in row[1])) for row in groupby(enumerate(t),lambda (i,v):i/3))

基本上: enumerate(t)返回一个迭代器,其中每个元素都是形式(t中的元素索引,t中的元素)

groupby(iterable,keyfunction)返回一个迭代器,其中每个元素都是格式(值,迭代器上迭代的元素,应用于该元素的键函数返回值)

reduce(function,iterable):从左到右累加两个参数的函数到序列的项目,以便将序列减少为单个值。例如,reduce(lambda x,y:x + y,[1,2,3,4,5])计算(((((1 + 2)+3)+4)+5)。 (来自python docs)

any(iterable)如果iterable的任何元素的值为True,则返回True,否则返回False。

因此我们将你的元组分成具有groupby的行,计算每行是否为同类并且只包含带有reduce的'X'或'Y',如果任何这些行为True,则返回True。