--- title: SIRLA - Python 暑期特訓 (Codewars) tags: sirla, python, Codewars description: 1. title 請改為 [授課名稱]課程 2. tag 請刪去template,加上活動內容類型或名稱 3. 下方會議記錄請使用會議記錄範本 4. 加上"{%hackmd BkVfcTxlQ %}"意為套用黑色模板 --- # **_Sorting by bits (Codewars)_** > 負責人:[黃丰嘉] > 授課時間:[2019-08-09 (五)] > --- # **參考資源** > 1. [Python sort 搭配 lambda 實現多欄位排序](https://www.itread01.com/content/1544862547.html) --- # **課程大綱** [TOC] --- ## (P) **題目:[Sorting by bits](https://www.codewars.com/kata/sorting-by-bits/train/python)** * 目標: * 將 ==list 的元素轉為二進位==後,依據二進位數值所含之 "1" 的數量==由少到多==排列。 * **若 "1" 的數量相同,再依據元素的數值(十進位數值)==由小到大==排列。** In this kata you're expected to sort an array of 32-bit integers in ascending order of the number of on bits they have. E.g Given the array [7, 6, 15, 8] 7 has 3 on bits (000...0111) -> 3個 "1" 6 has 2 on bits (000...0110) -> 2個 "1" 15 has 4 on bits (000...1111) -> 4個 "1" 8 has 1 on bit (000...1000) -> 1個 "1" So the array in sorted order would be [8, 6, 7, 15]. In cases where two numbers have the same number of bits, compare their real values instead. E.g between 10 (...1010) and 12 (...1100), they both have the same number of on bits '2' but the integer 10 is less than 12 so it comes first in sorted order. Your task is to write the function sortBybit() that takes an array of integers and sort them as described above. Note: Your function should modify the input rather than creating a new array. ## (P) **解法** :::info * 舉例: ``` sort_by_bit([3, 8, 3, 6, 5, 7, 9, 1]) => [1, 8, 3, 3, 5, 6, 9, 7] ``` ::: 1. 將 list 的元素轉為二進位,並計算 "1"的數量。 * count_arr 用來儲存==十進位元素==、==計算轉為二進位後之"1"的數量==。 ```python= def sort_by_bit(arr): count_arr = [] for i in range(len(arr)): count_arr.append([arr[i], bin(arr[i]).count("1")]) print(count_arr) ``` ``` Output: [[十進位元素, 計算轉為二進位後之"1"的數量], [十進位元素, 計算轉為二進位後之"1"的數量] ...] [[3, 2], [8, 1], [3, 2], [6, 2], [5, 2], [7, 3], [9, 2], [1, 1]] ``` 2. 排列:先依據二進位數值所含之 "1" 的數量==由少到多==排列。當 "1" 的數量相同,再依據元素的數值(十進位數值)==由小到大==排列。 ```python= def sort_by_bit(arr): count_arr = [] for i in range(len(arr)): count_arr.append([arr[i], bin(arr[i]).count("1")]) count_arr.sort(key = lambda pair: (pair[1], pair[0])) #新增 print(count_arr) ``` ``` Output: [[1, 1], [8, 1], [3, 2], [3, 2], [5, 2], [6, 2], [9, 2], [7, 3]] ``` 3. 輸出排序完的 list: new_arr。 ```python= def sort_by_bit(arr): count_arr = [] for i in range(len(arr)): count_arr.append([arr[i], bin(arr[i]).count("1")]) count_arr.sort(key = lambda pair: (pair[1], pair[0])) ### 新增 ### new_arr = [] for i in range(len(count_arr)): new_arr.append(count_arr[i][0]) print(new_arr) ``` ``` Output: [1, 8, 3, 3, 5, 6, 9, 7] ``` ### 完整程式碼 ```python= def sort_by_bit(arr): count_arr = [] for i in range(len(arr)): count_arr.append([arr[i], bin(arr[i]).count("1")]) count_arr.sort(key = lambda pair: (pair[1], pair[0])) new_arr = [] for i in range(len(count_arr)): new_arr.append(count_arr[i][0]) return new_arr ``` --- ### **補充:lambda** ``` test = [['a', 9, 5, 7],['b', 9, 0, 3], ['c', 5, 5, 1]] ``` * 單一欄位排序 ```python= test.sort(key = lambda pair: (pair[2])) print(test) test.sort(key = lambda pair: (pair[2]), reverse = True) print(test) ``` ``` Output: [['b', 9, 0, 3], ['a', 9, 5, 7], ['c', 5, 5, 1]] [['a', 9, 5, 7], ['c', 5, 5, 1], ['b', 9, 0, 3]] #由左到右 的 由大到小排列 ``` * 多欄位排序 ```python= test.sort(key = lambda pair: (pair[2], pair[1])) print(test) test.sort(key = lambda pair: (pair[2], pair[0]), reverse = True) print(test) ``` ``` Output: [['b', 9, 0, 3], ['c', 5, 5, 1], ['a', 9, 5, 7]] [['c', 5, 5, 1], ['a', 9, 5, 7], ['b', 9, 0, 3]] ``` ---