聽說做練習是掌握一門編程語言的最佳途徑,那就爭取先做滿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]
這下子就不會有重復數字了。太好了!
++++++++++++++++++++++++++++++++++++++++++++++