未加星标

Python练习题 017:三支乒乓球队出赛名单

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

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')。详见 官方文档 。

++++++++++++++++++++++++++++++++++++++

题目出处: 编程语言入门经典100例【Python版】

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: Python联想配对
分页:12
转载请注明
本文标题:Python练习题 017:三支乒乓球队出赛名单
本站链接:http://www.codesec.net/view/483681.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(38)