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 ...
随机推荐
- Selenium中核心属性以及方法
一.操作定位元素 selenium提供了定位元素的API,这些方法都被定义在webDriver类中,需要以find开头, 例如:find_Element_by_id('')
- python爬虫-贴吧
#!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 15:33# 文件 :spider_03.py# IDE :PyChar ...
- 我对Flutter的第一次失望
老孟导读:此文翻译自:https://medium.com/@suragch/my-first-disappointment-with-flutter-5f6967ba78bf 我喜欢Flutter. ...
- 【学习中】Unity Schedule
章节 内容 签到 第一课:界面介绍 第一讲 编辑器工作区 4月27日 第二课:资源管理 第二讲 资源及资源类型 4月27日 第三讲 资源管理:模型和角色动画的输出设置(上) 4月27日 第四讲 资源管 ...
- Java面试题(1):详解int与Integer
Java面试题(1):详解int与Integer int与Integer的区别 int是Java的基本数据类型之一,Integer是int的包装类 int直接再内存中储存值,Integer进行new操 ...
- 区块链Fabric 交易流程
1. 提交交易预案 1)应用端首先构建交易的预案,预案的作用是调用通道中的链码来读取或者写入账本的数据.应用端使用 Fabric 的 SDK 打包交易预案,并使用用户的私钥对预案进行签名. 应用打包完 ...
- SpringBoot简单(登录/显示/登出)工程下载 使用Thymeleaf输出页面文字
下载地址:https://files.cnblogs.com/files/xiandedanteng/SessionShare20191226.zip 测试用,画面如下: SpringMVC入门弟子也 ...
- AWD 第二弹
前言 小组第二次awd训练 万能密码登陆 首页发现一个登录界面,使用万能密码登陆 ' or 1=1#' 登陆成功后,发现Flag 任意文件上传 刚刚的后台界面存在上传按钮,可直接上传一句话木马 文件包 ...
- leetcode刷题-60第k个队列
题目 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123""132& ...
- mysql与redis区别
编号 mysql redis 1 类型 关系型数据库 缓存数据库 2 作用 主要用于存放持久化数据,是将数据存储在硬盘中,读取时速度较慢,而且频繁访问也会导致数据库负载过高. 用于存储使用频繁的 ...