不使用numpy/pandas实现字符串缺失值'_'均等填充的算法求助
缺失值填充实现方案(不依赖numpy/pandas)
实现逻辑
我们按照从左到右的分段填充规则处理,核心步骤如下:
- 先把输入的逗号分隔字符串拆分转换为列表,识别所有非缺失值的下标和对应数值
- 处理开头缺失段:如果第一个数字不在列表最左侧,将该数字均分给从列表开头到该数字位置的所有元素
- 处理中间段:遍历每一组相邻的数字,将两个数字的总和均分给两个数字所在位置之间的所有元素(包含两个数字本身的位置)
- 处理结尾缺失段:如果最后一个数字不在列表最右侧,将该数字均分给从该数字位置到列表末尾的所有元素
实现代码
def fill_missing_values(input_str): # 预处理输入字符串,转换为统一格式的列表 raw_items = [item.strip() for item in input_str.split(',')] arr = [] for item in raw_items: arr.append(int(item) if item != '_' else None) total_len = len(arr) # 收集所有非缺失值的索引和数值 not_null = [(idx, val) for idx, val in enumerate(arr) if val is not None] # 填充开头缺失部分 first_idx, first_val = not_null[0] if first_idx > 0: avg_val = first_val / (first_idx + 1) for i in range(first_idx + 1): arr[i] = avg_val # 填充中间相邻非缺失值之间的部分 for i in range(len(not_null) - 1): left_idx, left_val = not_null[i] right_idx, right_val = not_null[i + 1] sum_val = left_val + right_val seg_len = right_idx - left_idx + 1 avg_val = sum_val / seg_len for j in range(left_idx, right_idx + 1): arr[j] = avg_val # 填充结尾缺失部分 last_idx, last_val = not_null[-1] if last_idx < total_len - 1: avg_val = last_val / (total_len - last_idx) for i in range(last_idx, total_len): arr[i] = avg_val return arr
测试效果
你可以直接调用函数测试给定的示例:
- 示例1输入:
fill_missing_values("_, _, _, 24")
输出:[6.0, 6.0, 6.0, 6.0] - 示例2输入:
fill_missing_values("40, _, _, _, 60")
输出:[20.0, 20.0, 20.0, 20.0, 20.0] - 示例3输入:
fill_missing_values("80, _, _, _, _")
输出:[16.0, 16.0, 16.0, 16.0, 16.0] - 示例4输入:
fill_missing_values("_, _, 30, _, _, _, 50, _, _")
输出:[10.0, 10.0, 12.0, 12.0, 12.0, 12.0, 4.0, 4.0, 4.0]
内容的提问来源于stack exchange,提问作者1996
相关产品推荐
相关产品推荐

