作者Angesi (小雲豹)
看板Python
標題[問題]搜尋缺值 往前補齊
時間Tue Oct 9 14:39:35 2018
各位好
問題:有一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
→ ThxThx: 我不太理解 這樣排完之後不就是從1排到k,k <= 35嗎 10/09 15:12
是的 排完後會小於35 因為有3個數遺失
真的是很精簡的code 感謝回覆
比我用多層for迴圈寫 好多了
※ 編輯: Angesi (1.167.38.139), 10/09/2018 15:26:37
推 HenryLiKing: 樓上答案被刪掉了嗎? 10/09 22:24
→ manymuch: 我應該是用類似你的想法寫的,看不到樓上上的答案 10/10 08:06
非常好 但好像只能處理一個遺失值 ; 若4 5連續兩個遺失 if判斷可能會有問題
推 handsomeLin: 樓上你那個跟三個迴圈是一樣意思... 10/10 15:25
※ 編輯: Angesi (1.167.38.77), 10/11/2018 10:09:15
→ adrianshum: 不懂什麼叫往前遞補,比如1 2 3 7 9 就變成 1 2 3 4 5 10/12 08:55
→ adrianshum: ? 那麼看一下 list 的size 是多少(假設無重覆),再 10/12 08:55
→ adrianshum: 生一個 1..size 的sequence 就好啦? 10/12 08:55
我也想簡化問題...
→ stucode: 樓上,原 PO 意思是數字本身往前遞補但位置不變。例如: 10/12 19:09
→ stucode: [4, 5, 1, 2](缺3),遞補完會是 [3, 4, 1, 2], 不是 10/12 19:09
→ stucode: [1, 2, 3, 4],所以不能直接產生 1..size 的序列當結果。 10/12 19:09
→ stucode: 不過原 PO 的描述其實我一開始也沒看懂。 10/12 19:09
→ stucode: 話說回來,這個問題也可以直接做一次排序後線性掃描即可 10/12 19:10
原來能這樣解 被樓下實作出來了
→ adrianshum: 那麼就先sort,然後建value to index 的dict,再把原 10/12 21:46
→ adrianshum: list 由的value map 到對應index 就好了 10/12 21:46
解得真漂亮 用字典做為對映的工具 一一掃瞄回來
非常重要的想法!!!
※ 編輯: Angesi (1.167.38.106), 10/13/2018 10:08:45