Python 检查嵌套列表中的字符串

Python 检查嵌套列表中的字符串,python,list,function,nested,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],ls

我试图在我的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,但它继续下去。有什么想法吗?

简单地回答你的问题,你不是在重复使用
lst\u 1
。我想你会认为你在使用
triplet
的语句,但这实际上只是将
lst_1
复制到
triplet

我假设您实际上试图用
lst_1
生成一个生成器,并将其分配给
triplet
,但是您无意中使用了列表理解,并且不完全理解生成器的工作原理。阅读有关发电机的更多信息

虽然生成器在某些情况下无疑是有用的,但我认为它们实际上不会简化您的代码。无论如何,您都需要一个循环,您必须检查
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
其他一些NIT: 添加
else:如果elif else
循环完全无关,则将
传递到
的末尾。它不一定要在那里


另外,尽量避免使用全局变量。阅读一下Python中的作用域。它可能适用于简单的程序,但如果你在处理任何远程复杂的事情时依赖它们,这会对你造成伤害。

我认为你在
lst_1
中有一些额外的数据,这会把事情搞得一团糟。而且你的
all()
调用也缺少一些关键部分。缩进已关闭,这在Python中是至关重要的。您的变量
三元组
似乎与
lst_1
相同。您没有告诉我们
reply()
是什么或做什么。请看。谢谢@多索。为什么不需要全局功能?答案比我解释得更清楚。对不起,我按了回车键并提交了。基本要点是,它使代码难以理解,因为如果函数使用全局变量,那么函数范围之外的某些内容会影响它。