Python入门小练习,比赛名单推理题

问题描述:

两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
a说他不和x比,c说他不和x,z比,请编程序找出匹配赛手的名单。
一道简单的推理题,用程序编就没思路了,写的程序只能实现排除掉题目给出的条件,不能只给出唯一对应的名单,有什么好的方法:

甲 = ['a','b','c']
乙 = ['x','y','z']
for i in 甲:
     for j in 乙:
          if ((i == 'a') and (j == 'x')) or \
             ((i == 'c') and ((j == 'x') or (j == 'z'))):
               continue
          print(i,'\t','VS','\t',j)

打印结果:

a      VS      y
a      VS      z
b      VS      x
b      VS      y
b      VS      z
c      VS      y

其实就是保持甲队不动,假设a第一个出战,b第二个出战,c第三个出战,对已队的出战循序进行排列组合,总共九种情况,找出满足条件的就行了

#term_a: 'abc'
term_b =  ["x", "y", "z"]

for i in term_b:
    for j in term_b:
        for k in term_b:

            # 上面三层循环其实是求列表的全排列,
            # 第一层循环代表a的对手、第二层循环代表b的对手、第三层循环代表c的对手
            if i != j and i != k and j != k:
                
                # 这里根据逻辑判断即可
                if i != 'x' and k != 'x' and k != "z":
                    print("a的对手:",i)
                    print("b的对手:",j)
                    print("c的对手:",k)

当然还有更加清爽的玩法,逻辑跟上面的是一样的


import itertools
 
for i in itertools.permutations('xyz'):
    if i[0] != 'x' and i[2] != 'x' and i[2] != 'z':
        print('a vs %s, b vs %s, c vs %s' % (i[0], i[1], i[2]))