[問題]搜尋缺值 往前補齊

看板Python作者 (小雲豹)時間6年前 (2018/10/09 14:39), 6年前編輯推噓5(5013)
留言18則, 7人參與, 6年前最新討論串1/1
各位好 問題:有一list中存有1~35的數 但其中有些值遺失(比如:7 17 18) 長得像下面這樣: a = [10, 11, 13, 12, 16, 29, 15, 14, 28, 9, 8, 6, 5, 4, 1, 3, 2, 31, 25, 19, 24, 30, 26, 32, 33, 27, 23, 22, 34, 20, 21, 35] 如何找到缺失值,並往前遞補,(比如7不見8之後全部的數 往前遞補) 目前程式寫到這 就卡住了 b=[] #b用來存遺失的數 for i in range(len(a)): #i表示所有的數 1~35 for j in range(len(a)): #j表示list中的位置 if(i+1) == a[j]: break b += [i+1] 我覺得我再寫下去 可能要用第三個for迴圈........... 各位對這種往前補足數字的問題 有沒有更簡單的作法? 當天腦袋一片渾沌 思路不清 晚上回家後寫出我土法煉鋼版本 跟大家分享: _____________________________________________________________ (防雷頁) --------------------------------------------------- #找遺失值 notExist = [] #notExist用來儲存遺失值 exist = [] #Exist用來儲存存在值 for i in range(1,36): #i表示數 1~35 for j in range(len(a)): #j表示list中的位置 if (i != a[j]) & (j == len(a)-1): #若數到list最後一個 都沒對中 則此 notExist += [i] #數存入notExist elif (i != a[j]) & (j != len(a)-1): #若沒對中 但還未到list最後 則繼續對 continue elif i == a[j]: #若對中 存起來 對下一個i值 exist += [i] break #往前遞補 newList = [] for val in a: newVal = val for notE in notExist: if val > notE: #若a中的數比notExist中的大 則減1 往前補齊 newVal = newVal - 1 newList += [newVal] ------------------------------------------------- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.167.38.139 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1539067177.A.E70.html ※ 編輯: Angesi (1.167.38.139), 10/09/2018 14:51:28

10/09 15:12, 6年前 , 1F
我不太理解 這樣排完之後不就是從1排到k,k <= 35嗎
10/09 15:12, 1F
是的 排完後會小於35 因為有3個數遺失

10/09 15:16, 6年前 , 2F
真的是很精簡的code 感謝回覆 比我用多層for迴圈寫 好多了 ※ 編輯: Angesi (1.167.38.139), 10/09/2018 15:26:37

10/09 22:24, 6年前 , 3F
樓上答案被刪掉了嗎?
10/09 22:24, 3F

10/10 08:06, 6年前 , 4F

10/10 08:06, 6年前 , 5F
我應該是用類似你的想法寫的,看不到樓上上的答案
10/10 08:06, 5F
非常好 但好像只能處理一個遺失值 ; 若4 5連續兩個遺失 if判斷可能會有問題

10/10 15:25, 6年前 , 6F
樓上你那個跟三個迴圈是一樣意思...
10/10 15:25, 6F
※ 編輯: Angesi (1.167.38.77), 10/11/2018 10:09:15

10/11 15:33, 6年前 , 7F
http://tpcg.io/a0e7r8 換個ol編輯器, 用set可以簡單找缺
10/11 15:33, 7F

10/12 08:55, 6年前 , 8F
不懂什麼叫往前遞補,比如1 2 3 7 9 就變成 1 2 3 4 5
10/12 08:55, 8F

10/12 08:55, 6年前 , 9F
? 那麼看一下 list 的size 是多少(假設無重覆),再
10/12 08:55, 9F

10/12 08:55, 6年前 , 10F
生一個 1..size 的sequence 就好啦?
10/12 08:55, 10F
我也想簡化問題...

10/12 19:09, 6年前 , 11F
樓上,原 PO 意思是數字本身往前遞補但位置不變。例如:
10/12 19:09, 11F

10/12 19:09, 6年前 , 12F
[4, 5, 1, 2](缺3),遞補完會是 [3, 4, 1, 2], 不是
10/12 19:09, 12F

10/12 19:09, 6年前 , 13F
[1, 2, 3, 4],所以不能直接產生 1..size 的序列當結果。
10/12 19:09, 13F

10/12 19:09, 6年前 , 14F
不過原 PO 的描述其實我一開始也沒看懂。
10/12 19:09, 14F

10/12 19:10, 6年前 , 15F
話說回來,這個問題也可以直接做一次排序後線性掃描即可
10/12 19:10, 15F
原來能這樣解 被樓下實作出來了

10/12 21:46, 6年前 , 16F
那麼就先sort,然後建value to index 的dict,再把原
10/12 21:46, 16F

10/12 21:46, 6年前 , 17F
list 由的value map 到對應index 就好了
10/12 21:46, 17F

10/12 22:22, 6年前 , 18F
解得真漂亮 用字典做為對映的工具 一一掃瞄回來 非常重要的想法!!! ※ 編輯: Angesi (1.167.38.106), 10/13/2018 10:08:45
文章代碼(AID): #1Rl4qfvm (Python)
文章代碼(AID): #1Rl4qfvm (Python)