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

如何在Python中用列表推导式替换split结果的空值为递增序号?

如何用Python列表推导式替换空字符串为递增数字?

假设我们有一个通过str.split()得到的列表,比如对字符串numbers = "1/2//4//6"执行numbers.split("/")后得到['1', '2', '', '4', '', '6']。我们需要把其中的空字符串''替换为随空值递增的数字(第一个空值替换为1,第二个为2,以此类推),最终得到[1, 2, 1, 4, 2, 6]。

你已经用循环实现了需求,但代码风格偏Java:

auto = 1
for i,number in enumerate(numbers):
    if number == "":
        numbers[i] = auto
        auto += 1
    else:
        numbers[i] = int(number)

想要不用外部变量、用列表推导式实现?当然可行!核心思路是用生成器/迭代器来封装计数状态,让它在列表推导式里自动递增,来看看具体方案:

方案1:自定义生成器

先写一个简单的生成器函数,用来维护递增的计数:

def increment_counter():
    count = 0
    while True:
        count += 1
        yield count

然后在列表推导式里调用这个生成器的实例:

numbers = "1/2//4//6"
split_list = numbers.split("/")

# 初始化生成器
cnt_gen = increment_counter()
# 列表推导式处理
result = [int(num) if num else next(cnt_gen) for num in split_list]

print(result)  # 输出:[1, 2, 1, 4, 2, 6]

方案2:用itertools.count简化(更Pythonic)

Python标准库的itertools.count本身就是一个生成递增数字的迭代器,我们可以直接用它,省掉自定义生成器的步骤:

from itertools import count

numbers = "1/2//4//6"
split_list = numbers.split("/")

# 从1开始计数
cnt = count(1)
result = [int(num) if num else next(cnt) for num in split_list]

print(result)  # 输出:[1, 2, 1, 4, 2, 6]

原理说明

这两种方案的核心都是用迭代器的内部状态来维护计数,每次遇到空字符串时调用next()获取下一个递增数字,非空字符串则转成整数。这样既不用手动维护外部变量,又用列表推导式实现了简洁的代码,完全符合Python的风格~

内容的提问来源于stack exchange,提问作者snazzybouche

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:27:45