作者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://webptt.com/cn.aspx?n=bbs/Python/M.1539067177.A.E70.html
※ 编辑: Angesi (1.167.38.139), 10/09/2018 14:51:28
1F:→ ThxThx: 我不太理解 这样排完之後不就是从1排到k,k <= 35吗 10/09 15:12
是的 排完後会小於35 因为有3个数遗失
真的是很精简的code 感谢回覆
比我用多层for回圈写 好多了
※ 编辑: Angesi (1.167.38.139), 10/09/2018 15:26:37
3F:推 HenryLiKing: 楼上答案被删掉了吗? 10/09 22:24
5F:→ manymuch: 我应该是用类似你的想法写的,看不到楼上上的答案 10/10 08:06
非常好 但好像只能处理一个遗失值 ; 若4 5连续两个遗失 if判断可能会有问题
6F:推 handsomeLin: 楼上你那个跟三个回圈是一样意思... 10/10 15:25
※ 编辑: Angesi (1.167.38.77), 10/11/2018 10:09:15
8F:→ adrianshum: 不懂什麽叫往前递补,比如1 2 3 7 9 就变成 1 2 3 4 5 10/12 08:55
9F:→ adrianshum: ? 那麽看一下 list 的size 是多少(假设无重覆),再 10/12 08:55
10F:→ adrianshum: 生一个 1..size 的sequence 就好啦? 10/12 08:55
我也想简化问题...
11F:→ stucode: 楼上,原 PO 意思是数字本身往前递补但位置不变。例如: 10/12 19:09
12F:→ stucode: [4, 5, 1, 2](缺3),递补完会是 [3, 4, 1, 2], 不是 10/12 19:09
13F:→ stucode: [1, 2, 3, 4],所以不能直接产生 1..size 的序列当结果。 10/12 19:09
14F:→ stucode: 不过原 PO 的描述其实我一开始也没看懂。 10/12 19:09
15F:→ stucode: 话说回来,这个问题也可以直接做一次排序後线性扫描即可 10/12 19:10
原来能这样解 被楼下实作出来了
16F:→ adrianshum: 那麽就先sort,然後建value to index 的dict,再把原 10/12 21:46
17F:→ adrianshum: list 由的value map 到对应index 就好了 10/12 21:46
解得真漂亮 用字典做为对映的工具 一一扫瞄回来
非常重要的想法!!!
※ 编辑: Angesi (1.167.38.106), 10/13/2018 10:08:45