Python 检查嵌套列表中的字符串
我试图在我的tic-tac-toe程序中编写一个函数,检查网格上一行中的三个空格是否都标记为“x”或“o”。lst_1是所有可能的线路组合的列表: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
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()
是什么或做什么。请看。谢谢@多索。为什么不需要全局功能?答案比我解释得更清楚。对不起,我按了回车键并提交了。基本要点是,它使代码难以理解,因为如果函数使用全局变量,那么函数范围之外的某些内容会影响它。