You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于特定规则填充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)

填充逻辑规则

  1. 连续n个空元素,用其前面紧邻的n个非空元素依次填充;
  2. 若空元素在列表末尾,则用前一个非空元素填充。

优化解决方案

通过一次遍历即可实现,维护一个有效元素的缓存队列,遇到空值时从队列头部取元素填充,同时更新队列;遇到非空值时更新队列并保留原值。代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:20:35