Python練習題 017:三支乒乓球隊出賽名單,python017

來源:互聯網
上載者:User

Python練習題 017:三支乒乓球隊出賽名單,python017

【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 itertoolsfor 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 itertoolsteam_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 itertoolscheck_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)

 

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

題目出處:程式設計語言入門經典100例【Python版】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.