Python练习题 017:三支乒乓球队出赛名单
【Python练习题 017】 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比。请编程序找出三队赛手的名单。
------------------------------------------------------
这题真真想破我脑袋了,看了好几份别人的代码才勉强看懂,真是…… 一开始我只想着先把所有可能都配出来(ax, ay, az, bx, by, bz, cx, cy, cz),然后根据后面的条件排除不可能的配对。怎么写也写不对。
后来看了别人的代码,结合自己的思考,整理出基本思路如下:假设a,b,c的对手分别是i,j,k,将i,j,k所有可能出现的组合先穷举出来,同时需要满足2个条件:i,j,k不能同时出现(即a,b,c的对手不可能有重复);a不对x,c不对x,z,只要满足此2条件就可以。简而言之:用3个for穷举,用2个if限定条件。代码如下:
- for i in range(ord('x'), ord('z')+1): #假设a,b,c的对手分别是i,j,k
- for j in range(ord('x'), ord('z')+1): #用3个for穷举i,j,k可能出现的所有组合
- for k in range(ord('x'), ord('z')+1):
- if i != j and j != k and k != i: #条件1:i,j,k不能同时出现
- if i != ord('x') and k != ord('x') and k != ord('z'): #条件2:a不对x,c不对x,z
- print('a vs %s, b vs %s, c vs %s' % (chr(i), chr(j), chr(k)))
输出结果如下:
a vs z, b vs x, c vs y
根据上述代码,联想到之前 求解不重复的3位数 时用到的itertools库,觉得可以简化代码如下:
- 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]))
输出结果一样。代码简洁很多,结构也清晰不少。
itertools.permutations()是个好东西,可以直接将'xyz'生成包含所有排列的列表。另外两个相关的库方法分别是:itertools.product()生成笛卡尔数列(即包括所有排列方式,itertools.combinations()生成所有组合的列表。就生成项的数目而言,product() > permutations() > combinations()。本题中,permutations('xyz', 3)可生成6组排列方式,而如果换成combinations('xyz', 3),则只有1种组合方式('x', 'y', 'z')。详见官方文档。
【2016-10-17 更新】----------------------------------------------------
感谢 rm-rf 的耐心解答,又多了一种解题思路:先将 a,b,c 这一队列出所有可能的排列方式(共6组),然后每一组都跟 x,y,z 进行匹配(用zip()方法),并设置判断条件。事实证明,这6组之中,只有1组是满足条件的。代码如下:
- import itertools
- team_1 = ['a', 'b', 'c']
- team_2 = ['x', 'y', 'z']
- for i in itertools.permutations(team_1, 3):
- for j in zip(i, team_2):
- if j in [('a','x'),('c','x'),('c','z')]:
- break
- else:
- print(i, team_2)
输出结果如下:
('b', 'c', 'a') ['x', 'y', 'z']
rm-rf 还提供了另一种写法,但是……好吧,还没学到 lambda,自定义函数也还没怎么学,所以根本看不懂…… 但还是很感谢啊!希望过不了多久,我就能看懂了~~~
- import itertools
- check_list = [('a', 'x'), ('c', 'x'), ('c', 'z')]
- for i in itertools.permutations(team_1, 3):
- f = lambda a,b: len([True for j in zip(a, b) if j not in check_list])
- if f(i, team_2) == 3:
- print(i, team_2)
++++++++++++++++++++++++++++++++++++++
Python练习题 017:三支乒乓球队出赛名单的更多相关文章
- Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- Python练习题 027:对10个数字进行排序
[Python练习题 027] 对10个数字进行排序 --------------------------------------------- 这题没什么好说的,用 str.split(' ') 获 ...
- Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
- Python练习题 025:判断回文数
[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. ---------------------------------------- ...
- Python练习题 024:求位数及逆序打印
[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...
- Python练习题 004:判断某日期是该年的第几天
[Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? ---------------------------------------------- 这题竟然写了 28 行代码! ...
- Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。
Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- python 基础 2.8 python练习题
python 练习题: #/usr/bin/python #coding=utf-8 #@Time :2017/10/26 9:38 #@Auther :liuzhenchuan #@File ...
随机推荐
- [PKUWC2018]Minimax 题解
根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...
- py_创建文件以及写入读取数据+异常处理
import readline import math import json ''' A: 第一行 第二行 第三行 ''' #从文件读取数据 with open("D:\A.txt&quo ...
- 接口测试中GET方法的获取
今天在这里给大家介绍一下get方法,其实这些方法大家可以看一下源码里面的介绍只需要在代码中输入: import requests help(requests) 就可以看到带有示例的解释: 现在我们来完 ...
- 阿里大牛教你基于Python的 Selenium自动化测试示例解析
今天给大家讲解的是自动化测试示例的解析,如有不对的地方请多多指教. 自动化测试示例如下: from selenium import webdriver from selenium.webdriver. ...
- java工具类去掉字符串String中的.点。android开发java程序员常用工具类
下面是工具类详细代码: package com.qq986945193.david; /** * qq986945193 Project * ============================= ...
- Micro-CMS v1 (Hacker101 CTF)
这道题一共有四个flag,初步观察可以创建或者修改发布的内容. Flag1: 首先随便创建了一个页面,创建完成后页面会直接跳转到我们所创建的页面. 初步判断网页应该是根据地址栏后的数字来查询并且显示页 ...
- ConcurrentHashMap的size方法是线程安全的吗?
前言 之前在面试的过程中有被问到,ConcurrentHashMap的size方法是线程安全的吗? 这个问题,确实没有答好.这次来根据源码来了解一下,具体是怎么一个实现过程. ConcurrentHa ...
- Jmeter逻辑控制器,简单操作
1. 2. 循环控制器可以设置请求的循环次数或永久循环, . 作用:改控制器下的取样器请求可以循环运行. 3. 请求需要拖拽到循环控制器里, 4.循环次数乘以线程数 得到如下图: 成功了 二. 事务 ...
- 取得min和max之间包括端点的随机整数
产生随机数的函数用处不少,写一个放博客里备用,函数如下: /** * get a random integer between min and max * @param min * @param ma ...
- 入门alibaba的EasyExcel
一.关于EasyExcel 1.什么是EasyExcel,有什么作用? EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. ...