Python 我想为我的函数调用元组中的元素
我想在Tictatoe游戏的其中一条线已满时实现:Python 我想为我的函数调用元组中的元素,python,Python,我想在Tictatoe游戏的其中一条线已满时实现: 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:][
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\u linha(teste5)
->True
和
vencedor\u linha(teste6)
->False
问题是:它给了我vencedor_linha(teste5)
->False
,因为如果正常工作,我就无法得到
另外,我不能使用列表,所以不用麻烦告诉我p如果要检查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行;我不清楚您的原始代码是否仅尝试检查第一行。)一个使用itertools的单行程序,它与几乎所有使用itertools进行智能化处理的程序一样:
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))
基本上:
枚举(t)返回一个迭代器,其中每个元素的形式为(t中元素的索引,t中元素)
groupby(iterable,keyfunction)返回一个迭代器,其中每个元素的形式为(value,iterable元素上的迭代器,应用于该元素的keyfunction返回值)
reduce(function,iterable):将两个参数的函数从左到右累积应用于序列项,以便将序列减少为单个值。例如,reduce(lambda x,y:x+y,[1,2,3,4,5])计算(((1+2)+3)+4)+5)。(来自python文档)
如果iterable的任何元素的计算结果为True,则any(iterable)返回True,否则返回False
因此,我们使用groupby将元组分解为多行,计算每行是否同构,是否只包含带reduce的“X”或“Y”,如果其中任何一行为真,则返回True。tl[0:][0:][code>不代表您可能等待的内容tl[0:][0:][0:][0:][0:
也是可能的,并返回原始的tl
。您不能使用列表是什么意思?ty,wooble。问题是我不能使用all和row。@e先生:这是一个大一的项目,还不能在这个项目上使用列表。好吧,你可以展开循环并all()
到6if
语句,如果这是你的教授真正想要的。如果是家庭作业,我不会给你写代码。