如何找到多个集合和列表之间的交叉点?

时间:2018-01-15 07:10:48

标签: python python-2.7

所以我在我的tic tac toe游戏中有多组作为胜利条件:

    win1 = {1,2,3}
    win2 = {4,5,6}
    win3 = {7,8,9}
    win4 = {1,5,9}
    win5 = {7,5,3}
    win6 = {1,4,7}
    win7 = {2,5,8}
    win8 = {3,6,9}

其中每个数字是tic tac toe网格上的位置。我还有一个列表,可以添加O和X播放器的每个位置。我目前检查玩家是否获胜的方式是:

    def checker():
      if (win1 or win2 or win3 or win4 or win5 or win6 or win7 or win8).issubset(jonesO):
        print 'O wins!'
        return 0
      elif (win1 or win2 or win3 or win4 or win5 or win6 or win7 or win8).issubset(jonesX):
        print 'X wins!'
        return 1
      elif (tie).issubset(bob):
        print 'IT IS A TIE!!!!!'
        return 2

但我发现.issubset只检查第一组而没有别的。如何更改它,以便将elif()中的所有集合和if检查为子集?

2 个答案:

答案 0 :(得分:1)

在Python中,a or b or c评估三个中的第一个是真实的(如果没有真正的,那么它是最后一个)。在您的情况下,这将是第一个非空setwin1。对于您的情况,您可以使用any

if any(x.issubset(jonesO) for x in (win1, win2, win3, win4, win5, win6, win7, win8)):
    print 'O wins!'

答案 1 :(得分:0)

isSubSet 是一项代价高昂的操作,您应该使用set的 union 运算符。

any(jonesO==jonesO.union(x) for x in (win1, win2, win3, win4, win5, win6, win7, win8))

如果任何获胜组合属于移动设置,则此条件将返回 True 。否则将返回 False

基本上,如果join set已经是其他set

的子集,则两个set的并集将返回相同的set