检查嵌套列表中的字符串

时间:2016-11-30 22:42:16

标签: python list function nested

我正在尝试在我的tic-tac-toe程序中编写一个函数,该程序检查网格中一行中的所有三个空格是否都标记为'x'或'o'。 lst_1是所有可能的行组合的列表:

def conc():
    global lst
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]],    [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]],    [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],     [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],    [lst[2],lst[4],lst[6]]]
    triplet = [s for s in lst_1]
     if all('o' == item for item in triplet):
        print('Player 2 wins!')
        reply()
    elif all('x' == item for item in triplet):
        print('Player 1 wins!')
        reply()
    else:
        pass 

当有人设法连续获得3分时,我认为这会停止游戏,但它会一直持续下去。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

简单地回答你的问题,你没有遍历lst_1。我想你认为你是出于triplet所使用的陈述,但实际上只是将lst_1复制到triplet

我假设您实际上是在尝试使用lst_1生成一个生成器并将其分配给triplet,但您不小心使用了列表推导而不完全了解生成器的工作原理。阅读有关生成器here的更多信息。

虽然生成器在某些情况下无疑是有用的,但我认为它们实际上不会简化您的代码。无论如何,您将需要一个循环,并且您必须检查StopIteration异常以找出生成器何时结束。

所以,我的建议只是使用for循环。

def conc():
    global lst
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]],    [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]],    [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],     [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],    [lst[2],lst[4],lst[6]]]
    for triplet in lst_1:
        if all('o' == item for item in triplet):
            print('Player 2 wins!')
            reply()
            break
        elif all('x' == item for item in triplet):
            print('Player 1 wins!')
            reply()
            break

其他一些尼特: 将else: pass添加到if-elif-else循环的末尾是完全无关紧要的。它不一定在那里。

另外,尽量避免全局变量。在Python中阅读一些关于范围的内容。它可能适用于简单的程序,但是当你遇到任何远程复杂的东西时它依赖它们会对你造成伤害。