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

如何将二维列表中的非零值替换为从1开始的递增计数?

解决二维列表非零值全局递增替换的问题

我来帮你搞定这个需求!你想要把二维列表里的所有非零元素替换成从1开始的连续递增数字,零值保持不变对吧?咱们直接看解决方案:

基础实现(清晰易懂)

最直观的方式就是维护一个全局计数器,遍历整个二维列表,遇到非零元素就用当前计数器值替换,然后计数器自增:

original_list = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]
count = 1
result_list = []

# 遍历每一行
for row in original_list:
    new_row = []
    # 遍历行内的每个元素
    for num in row:
        if num != 0:
            new_row.append(count)
            count += 1
        else:
            new_row.append(0)
    result_list.append(new_row)

print(result_list)  # 输出: [[0, 0], [1, 0], [2, 0], [3, 4], [0, 5]]

这段代码逻辑很直白:count从1开始,每遇到一个非零元素就把它换成当前的count,然后count加1;零元素直接原封不动保留。

简洁写法(生成器+列表推导式)

如果你偏爱更简洁的代码,可以用生成器来管理全局计数器,配合嵌套列表推导式实现:

original_list = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]

# 定义一个生成器,持续输出递增的数字
def global_counter():
    current = 1
    while True:
        yield current
        current += 1

# 初始化生成器
cnt = global_counter()
# 用列表推导式完成替换
result_list = [[next(cnt) if num != 0 else 0 for num in row] for row in original_list]

print(result_list)  # 同样得到目标输出

生成器global_counter()会一直生成从1开始的递增数字,每次调用next(cnt)就会拿到下一个数,完美适配全局递增的需求。

为什么单独用enumerate搞不定?

你之前尝试用enumerate没成功,应该是因为enumerate只能拿到元素的局部索引(行内索引或者行索引),但你的需求是全局范围内的递增计数——不管元素在第几行第几列,只要是非零就按出现顺序从1开始数,所以必须额外维护一个全局的计数器变量,而不是依赖索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:31:45