基于特定规则填充Python列表中的空字符串缺失值
问题:按规则填充列表中的空字符串
给定列表中存在空字符串,需要按特定规则填充空值,以下是示例及规则:
示例说明
- 输入:
lis = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , 'Elemnt-6' , 'Elemnt-7']
输出:['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-6' , 'Elemnt-7'] - 补充示例1:
输入:lis = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , '' , 'Elemnt-7']
输出:['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-7'] - 补充示例2:
输入:lis = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , 'Elemnt-6' , 'Elemnt-7', '']
输出:['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-2' , 'Elemnt-3' , 'Elemnt-6' , 'Elemnt-7' , 'Elemnt-7']
原实现代码(效率低下)
原代码通过拆分奇偶索引列表再合并的方式实现,但处理长列表和多缺失值时效率不足:
from itertools import accumulate lis = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , 'Elemnt-6' , 'Elemnt-7'] odd_index = lis[::2] even_index = lis[1::2] odd_index = list(accumulate(odd_index,lambda x, y: x if y is '' else y)) even_index = list(accumulate(even_index,lambda x, y: x if y is '' else y)) zipper = list(sum(zip(odd_index, even_index+[0]), ())[:-1]) print(zipper)
填充逻辑规则
- 连续n个空元素,用其前面紧邻的n个非空元素依次填充;
- 若空元素在列表末尾,则用前一个非空元素填充。
优化解决方案
通过一次遍历即可实现,维护一个有效元素的缓存队列,遇到空值时从队列头部取元素填充,同时更新队列;遇到非空值时更新队列并保留原值。代码如下:
def fill_empty(lst): valid_elements = [] result = [] for item in lst: if item != '': result.append(item) valid_elements.append(item) else: if not valid_elements: result.append('') else: # 取出队列头部元素填充,再移到队尾保证循环取用 fill_val = valid_elements.pop(0) result.append(fill_val) valid_elements.append(fill_val) # 处理末尾空值的特殊情况:替换为最后一个有效元素 if result and result[-1] == '' and valid_elements: result[-1] = valid_elements[-1] return result # 测试示例 lis1 = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , 'Elemnt-6' , 'Elemnt-7'] print(fill_empty(lis1)) # 输出: ['Elemnt-1', 'Elemnt-2', 'Elemnt-3', 'Elemnt-2', 'Elemnt-3', 'Elemnt-6', 'Elemnt-7'] lis2 = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , '' , 'Elemnt-7'] print(fill_empty(lis2)) # 输出: ['Elemnt-1', 'Elemnt-2', 'Elemnt-3', 'Elemnt-1', 'Elemnt-2', 'Elemnt-3', 'Elemnt-7'] lis3 = ['Elemnt-1' , 'Elemnt-2' , 'Elemnt-3' , '' , '' , 'Elemnt-6' , 'Elemnt-7', ''] print(fill_empty(lis3)) # 输出: ['Elemnt-1', 'Elemnt-2', 'Elemnt-3', 'Elemnt-2', 'Elemnt-3', 'Elemnt-6', 'Elemnt-7', 'Elemnt-7']
代码说明
- 遍历列表时,非空元素直接加入结果列表,并同步到
valid_elements队列; - 空元素从队列头部取元素填充,再将该元素放回队尾,确保后续空值能按顺序取用前面的有效元素;
- 最后单独处理末尾空值,符合规则要求;
- 该方案时间复杂度为O(n),空间复杂度为O(k)(k为非空元素数量),处理长列表和多缺失值时效率远高于原实现。
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

