首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >或列表python 3中的语句。

或列表python 3中的语句。
EN

Stack Overflow用户
提问于 2014-12-14 18:17:51
回答 1查看 152关注 0票数 0

我正在为我的python 3类制作一个tic tac程序,并想知道为什么我的计算机win move不能正常工作。似乎‘或’in 'list‘函数没有得到正确的评估。是否有其他方法来完成评估条件?

代码语言:javascript
复制
def winningMoves():
    print('starting computer winning move')
    i = [1, 2, 3, 7]
    if (1 and 2 in i) or (5 and 7 in i) or (6 and 9 in i):
        drawBoardlist[3] = computerCharacter
    elif (2 and 3 in i) or (4 and 7 in i) or (5 and 9 in i):
        drawBoardlist[1] = computerCharacter
    elif (1 and 2 in i) or (3 and 5 in i) or (8 and 9 in i):
        drawBoardlist[7] = computerCharacter
    elif (7 and 8 in i) or (1 and 5 in i) or (3 and 6 in i):
        drawBoardlist[10] = computerCharacter
    else:
        print('No winning moves')
    return
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-14 18:20:45

(1 and 2 in i)被解析为((1) and (2 in i))。相反,你可能是说

代码语言:javascript
复制
((1 in i) and (2 in i))

对于所有其他条件也是如此。

例如,比较,

代码语言:javascript
复制
In [47]: i = [1, 2, 3, 7]

In [48]: (100 and 2 in i)
Out[48]: True

In [49]: ((100 in i) and (2 in i))
Out[49]: False

运算符优先表显示and的优先级低于in。因此,inand绑定得更紧密,因此在and绑定1(2 in i)以形成1 and (2 in i)之前,in(2 in i)结合得更紧密。

这就是为什么(1 and 2 in i)被解析为((1) and (2 in i))的原因。

顺便说一句,检查一个项目是否在列表中是一个O(n)操作。如果你经常这样做,就像你看起来的那样,你最好先把列表变成一个集合,因为在一个集合中检查成员资格是O(1)。

代码语言:javascript
复制
iset = set(i)
if (1 in iset and 2 in iset)

代码语言:javascript
复制
if iset.issuperset((1, 2))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27472458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档