填充指定格式中的缺失值

时间:2021-06-28 13:53:22

标签: python

我们不能使用 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, _, _, _" 这样的字符串并返回填充的序列

2 个答案:

答案 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]