我们不能使用 numpy 或 pandas ,谁能帮我找到它的方法 您将获得一个带有数字和“_”(缺失值)符号的字符串,您必须按照说明替换“_”符号 Ex 1: _, _, _, 24 ==> 24/4, 24/4, 24/4, 24/4 即我们。已将 24 个平均分配给所有 4 个位置
例 2: 40, _, _, _, 60 ==> (60+40)/5,(60+40)/5,(60+40)/5,(60+40)/5, (60+40)/5 ==> 20, 20, 20, 20, 20 即 (60+40) 的总和被均匀地分配到所有 5 个位置
例 3: 80, _, _, _, _ ==> 80/5,80/5,80/5,80/5,80/5 ==> 16, 16, 16, 16, 16 即80 被均匀地分配给所有 5 个正确的缺失值
例 4:_, _, 30, _, _, _, 50, _, _
==> 我们将从左到右填充缺失值
一种。首先我们将 30 分布到左边两个缺失值 (10, 10, 10, _, _, _, 50, _, _)
湾现在在 (10, 10, 12, 12, 12, 12, 12, _, ) 之间分配总和 (10+50) 个缺失值
C。现在我们将 12 个分配到右侧缺失值 (10, 10, 12, 12, 12, 12, 4, 4, 4)
对于具有逗号分隔值的给定字符串,它将有两个缺失值数字,例如:“, _, x, _, _, ” 您需要填充缺失值
问:你的程序读取一个像 ex: ", _, x, _, _, _" 这样的字符串并返回填充的序列
答案 0 :(得分:0)
试图涵盖尽可能多的边缘情况:
inp = "80, _, _, _, _"
inp=inp.split(", ")
start=-1
end=-1
new_arr=inp.copy()
for i in range(len(inp)):
if (inp[i]=='_')&(i!=len(inp)-1):
continue
elif start==-1:
if i==0: ## 0th position element has non blank value
# print("cond1")
start=0
end=0
new_arr[i]=int(inp[i])
else:
# print("cond2")
start=i
end=i
avg=int(inp[start])/(i+1)
for k in range(0, start+1):
new_arr[k]=avg
elif i==len(inp)-1: ## reached last element
# print("cond3")
avg=int(new_arr[start])/(i+1-start)
for k in range(start, i+1):
new_arr[k]=avg
else:
# print("cond4")
end=i
if end-start>1: ## blank are present
avg=(int(new_arr[start])+int(new_arr[end]))/(end-start+1)
for k in range(start, end+1):
new_arr[k]=avg
start=end
print(new_arr)
这个复杂度是~O(n),空间复杂度~O(n)
答案 1 :(得分:0)
仅基于您所提供的, 这是对所要求内容的愚蠢实现。
def fill_in(s : str):
l = s.split(',')
last = -1
for e, i in enumerate(l):
if i.strip() != '_':
if last==-1:
filler = float(i) / (e+1)
l = [filler]*(e+1) + l[e+1:]
last = e
else:
filler = (l[last] + float(i)) / (e - last +1)
l = l[0:last] + [filler]*(e - last +1) + l[e+1:]
last = e
elif e==len(l)-1:
if last==-1:
last = 0
filler = l[last] / (len(l) - last)
l = l[:last] + [filler]*(len(l) - last)
return l
用法:
fill_in('_, _, 30, _, _, _, 50, _, _')
返回:
[10.0, 10.0, 12.0, 12.0, 12.0, 12.0, 4.0, 4.0, 4.0]