[問題] 用for迴圈找眾數

看板Python作者 (殺刀豬)時間2年前 (2022/03/21 19:11), 2年前編輯推噓8(8018)
留言26則, 8人參與, 2年前最新討論串1/1
各位大大安安 小弟正在自學python (https://tinyurl.com/yu9nfd6f ) 迴圈實在弄得我頭痛QQ 有個題目如下: 尋找眾數 numbers_str 是一個使用者輸入的以逗號分隔數字的字串。 從 numbers_str 中找到眾數(最常見的數字)並顯示出: 眾數是{眾數} 提示 1 使用 split() 方法把一個以逗號分隔數字的字串轉換成一個串列。 提示 2 嘗試創造一個字典,其中每個鍵是串列中的一個數字,而值是該數字出現在串列中的次數 。 例如,如果串列是[10, 20, 10, 30],我們要創造以下字典: { 10: 2, 20: 1, 30: 1 } 解答如下: numbers_str = input('請輸入以逗號分隔的一串數字: ') #這是題目已經預設的 numbers = numbers_str.split(',') # occurrences 儲存一個數字出現的次數 occurrences = {} for n in numbers: if n in occurrences: occurrences[n.strip()] += 1 else: occurrences[n.strip()] = 1 # mode 是目前最常出現的數字 mode = -1 # mode_count 是 mode 出現的次數 mode_count = 0 for n, count in occurrences.items(): if mode_count == 0 or mode_count < count: mode = n mode_count = count print(f'眾數是{mode}') 解答到上半部的for都還看得懂 下半部就不懂為什麼要把mode=-1 if的 mode_count < count這個部分也還可以 mode_count == 0 就不懂了 然後我嘗試跑了他的解答 發現答案好像不是完整的眾數 例如我如果輸入的是: 7,7,1,1,8 答案只會出現7 而沒有辦法顯示全部的答案 不太確定是我的問題還是題目沒有出好@@ 再拜託各位大大幫忙解答 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.235.193.17 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1647861101.A.615.html ※ 編輯: i329 (36.235.193.17 臺灣), 03/21/2022 19:13:42 ※ 編輯: i329 (36.235.193.17 臺灣), 03/21/2022 19:14:36

03/21 19:20, 2年前 , 1F
題目定義不夠嚴謹,沒有說要把次數一樣的都印出來,
03/21 19:20, 1F
請教一般要找眾數有其他的方法嗎?

03/21 19:20, 2年前 , 2F
mode 設成 -1 應該是假設數列都是正數
03/21 19:20, 2F

03/21 19:41, 2年前 , 3F
mode -1是因為他已經先把-1列為不可能出現的數,所以
03/21 19:41, 3F

03/21 19:41, 2年前 , 4F
以它為初始值
03/21 19:41, 4F
我剛剛試了 [-1,7,-9,11,-1,3,6,7] 是可以找出-1的 @@ 所以好像沒有限制一定要正數? 然後想問一下mode_count == 0的用意 感謝 ※ 編輯: i329 (36.235.193.17 臺灣), 03/21/2022 20:42:23

03/21 21:34, 2年前 , 5F
-1 & 0 都是初始化。只要 count > 0 代表新的眾數出現,就
03/21 21:34, 5F

03/21 21:34, 2年前 , 6F
把舊的 key取代掉
03/21 21:34, 6F
感謝大大回應 請問初始化的話是不是設定任意數都可以呢? 另外不明白已經設定mode_count = 0 那跟後面的mode_count == 0有關係嗎 這個又是什麼意思呢? ※ 編輯: i329 (36.235.193.17 臺灣), 03/21/2022 22:33:07

03/21 22:55, 2年前 , 7F
造出來的字典你知道長甚麼樣子之後
03/21 22:55, 7F

03/21 22:55, 2年前 , 8F
你不一定要用解答的方式造
03/21 22:55, 8F

03/21 22:56, 2年前 , 9F
-1,0 你可以換成其他初始值
03/21 22:56, 9F
好的

03/21 23:06, 2年前 , 10F
mode_count == 0 的意思是「當目前沒有任何眾數時,無條
03/21 23:06, 10F

03/21 23:06, 2年前 , 11F
件將目前的 n 當作眾數」。在某些情況下這種條件是有必要
03/21 23:06, 11F

03/21 23:06, 2年前 , 12F
的,但以這個題目來說有點多餘,因為 count 不可能小於 1
03/21 23:06, 12F

03/21 23:06, 2年前 , 13F
,所以第一次進入迴圈 mode_count < count 一定會成立。
03/21 23:06, 13F

03/21 23:07, 2年前 , 14F
code 的部份 mode = -1 改成 mode = None
03/21 23:07, 14F

03/21 23:07, 2年前 , 15F
然後 mode_count == 0 去掉,應該就比較好理解
03/21 23:07, 15F
我試了一下似乎是可以運行的 感謝 可以請教mode_count == 0在什麼情況下是必要的呢?

03/22 09:21, 2年前 , 16F
初始化並不是任意數都可以...
03/22 09:21, 16F
可以請大大講的詳細一點 或是指點方向嗎?

03/22 11:26, 2年前 , 17F
mode = -1 以下在寫什麼? 為甚麼不直接根據value排序?
03/22 11:26, 17F
可以請大大說說看你的想法嗎? ※ 編輯: i329 (36.235.193.17 臺灣), 03/22/2022 12:10:56

03/22 13:06, 2年前 , 18F
根據value大到小排序 最前面的就是眾數啊
03/22 13:06, 18F
對欸 好像比較好懂

03/22 14:39, 2年前 , 19F
初始化選不含在你數值範圍內的值,例,正整數用-1
03/22 14:39, 19F

03/22 14:40, 2年前 , 20F
排序就練不到for-loop
03/22 14:40, 20F

03/22 14:42, 2年前 , 21F
例:max(occurrences, key = lambda x:occurrences[x])
03/22 14:42, 21F
原來如此 感謝各位大大解惑 ※ 編輯: i329 (36.235.193.17 臺灣), 03/22/2022 18:28:05

03/22 23:45, 2年前 , 22F
有興趣可以去看資料結構的排序與搜尋
03/22 23:45, 22F

03/22 23:46, 2年前 , 23F
程式語言的內建方法都是包裝過的API
03/22 23:46, 23F
好的 我再努力

03/23 02:27, 2年前 , 24F
拿紙筆一步一步跟著程式手動執行,把每一步都寫下來
03/23 02:27, 24F
我遇到一個問題 有些寫法看不懂 又沒辦法打開一個一個看 該怎麼辦呢@@ ※ 編輯: i329 (36.235.165.174 臺灣), 03/24/2022 22:50:08

03/26 16:48, 2年前 , 25F
什麼叫打開一個一個看?你知道問題,你知道別人的答案,你
03/26 16:48, 25F

03/26 16:48, 2年前 , 26F
還需要什麼?
03/26 16:48, 26F
文章代碼(AID): #1YE5rjOL (Python)