Python-100 練習題 01 & 列表推導式

spearhead_cai發表於2019-01-27

最近打算好好練習下 python,因此找到一個練習題網站,打算每週練習 3-5 題吧。

www.runoob.com/python/pyth…

另外,這個網站其實也還有 Python 的教程,從基礎到高階的知識都有。


Example-1 三位陣列合

題目:有四個數字:1、2、3、4,能組成多少個互不相同且無重複數字的三位數?各是多少?

思路

最簡單的方法,就是窮舉法了,分別求出在百位、十位、個位上的數字,然後剔除出現重複數字的組合,剩餘的就是答案了。

程式碼實現

直接程式碼實現如下:

def create_three_digits(number_start=1, number_end=4):
    '''
    給定指定數字範圍(比如1到4),求可以組成多少個無重複的三位數
    :param number_start: 起始數字
    :param number_end: 結束數字
    :return: 返回數量,以及可能的三位數的列表
    '''
    count = 0
    result_list = list()
    for i in range(number_start, number_end + 1):
        for j in range(number_start, number_end + 1):
            for k in range(number_start, number_end + 1):
                if (i != j) and (i != k) and (j != k):
                    count += 1
                    result_list.append(str(i) + str(j) + str(k))
    return count, result_list
複製程式碼

寫得更加簡便點,可以採用列表推導式:

def create_three_digits2(number_start=1, number_end=4):
    '''
    採用列表推導式實現
    :param number_start:
    :param number_end:
    :return:
    '''
    return [str(i) + str(j) + str(k) for i in range(number_start, number_end + 1) for j in
            range(number_start, number_end + 1) for k in
            range(number_start, number_end + 1) if (i != j) and (i != k) and (j != k)]
複製程式碼

輸出結果如下,總共有 24 種不同的排列組合。

valid count=24, and they are:
123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432
複製程式碼

當然,目前這種程式碼實現的時間複雜度是很高的,畢竟是三個for迴圈。如果有更好的解法,可以在評論留言,告訴我!

知識點複習--列表推導式

列表推導式(又稱列表解析式)提供了一種簡明扼要的方法來建立列表。

它的結構是在一箇中括號裡包含一個表示式,然後是一個 for 語句,然後是 0 個或多個 for 或者 if 語句。那個表示式可以是任意的,意思是你可以在列表中放入任意型別的物件。返回結果將是一個新的列表,在這個以 if 和 for 語句為上下文的表示式執行完成之後產生。

用程式碼表示列表推導式如下:

variable = [out_exp for out_exp in input_list if out_exp == 2]
複製程式碼

一個簡明的例子如下:

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
複製程式碼

那麼,什麼時候最適合用列表推導式呢?

其實是當你需要使用 for 迴圈來生成一個新列表。舉個例子,你通常會這樣做:

squared = []
for x in range(10):
    squared.append(x**2)
複製程式碼

這時候,採用列表推導式最合適:

squared = [x**2 for x in range(10)]
複製程式碼

原始碼在:

github.com/ccc013/Code…


參考文章:

歡迎關注我的微信公眾號--機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!

Python-100 練習題 01 & 列表推導式

往期精彩推薦

學習筆記
數學學習筆記
Github專案 & 資源教程推薦

相關文章