Python練習題 001:4個數字求不重復的3位數


聽說做練習是掌握一門編程語言的最佳途徑,那就爭取先做滿100道題吧。

----------------------------------------------------------------------

【Python練習題 001】有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?

這題還算比較簡單,思路是:先確定百位數、然后是十位數、個位數。1-4 四個數字循環一遍,就都全出來了。 

res = []
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            res.append(i*100+j*10+k)
print(res)

 如果不放心結果是否有重復,最后一行可以改成 print(set(res)),把 res 的類型由列表改為集合(set)。因為集合不允許有重復值,所以就可以保證結果的不重復性了。

 

【2016-10-12 更新 】-------------------------------------------------------------------------

 受教於 backinfile 在評論中的說明,嘗試了 itertools.product() 這種新方法,可以方便地生成任意多個集合的笛卡爾積:

所謂“笛卡爾積”,大致就是指 2 個(或多個)集合所有元素排列組合的所有可能。

用於本道題的話,只要生成 3 個 [1, 2, 3, 4] 數列的笛卡爾積,再分別安放到百位、十位、個位,就可以了。即:

 

import itertools
res = itertools.product(range(1,5),3)
print([x[0]*100 + x[1]*10 + x[2] for x in set(res)], end = ', ')

 

運行結果如下:

[434, 422, 441, 132, 144, 224, 131, 432, 331, 341, 142, 433, 241, 342, 143, 231, 333, 343, 232, 431, 332, 243, 141, 233, 242, 314, 322, 414, 334, 313, 323, 244, 312, 121, 311, 321, 122, 214, 123, 411, 124, 212, 424, 111, 223, 324, 213, 412, 222, 413, 113, 221, 211, 421, 112, 444, 344, 443, 134, 234, 423, 114, 133, 442]

 

【2016-10-13 更新】-------------------------------------------------------------------------

 從運行結果可以發現,像“434”、“422”、“441”這些數字並不符合“無重復數字”的要求。感謝 codegay 的提示,查了下 官方文檔,發現其實應該用 itertools.permutations() 生成無重復的所有排列可能:

 

因此,修改本題代碼如下:

import itertools
res = []
[res.append(i[0]*100 + i[1]*10 + i[2]) for i in itertools.permutations(range(1,5),3)]
print(res, end = ',')

輸出結果如下:

[123, 124, 132, 134, 142, 143, 213, 214, 231, 234, 241, 243, 312, 314, 321, 324, 341, 342, 412, 413, 421, 423, 431, 432]

這下子就不會有重復數字了。太好了!

 

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM