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

如何修改Python代码以支持任意数量0的列表最近0距离计算

问题:计算列表中每个元素到最近0的距离(支持多0场景)

用户提供的原代码仅能处理列表中只有一个0的情况,当存在多个0时,输出结果会出错。原代码如下:

lst = [2, 1, 0, 3, 5]
length = len(lst)
dist = []

for i in lst:
    if lst.index(0) > lst.index(i):
        diff = lst.index(0) - lst.index(i)
        dist.append(diff)
    elif lst.index(0) < lst.index(i):
        diff = abs(lst.index(i)) - abs(lst.index(0))
        dist.append(diff)
    elif lst.index(0) == lst.index(i):
        dist.append(0)
print(dist)

# Output: [2, 1, 0, 1, 2]

原代码的核心问题

lst.index(0)只会返回第一个出现的0的索引,当列表中有多个0时,后续的0以及它们附近的元素无法正确匹配到最近的0,导致距离计算错误。比如输入[0,2,0,4],原代码会把第四个元素的距离错误计算为3,实际应该是1。


高效解决方案:两次遍历法

这种方法时间复杂度为O(n),无需额外存储大量索引,效率最优:

def nearest_zero_distance(lst):
    length = len(lst)
    dist = [float('inf')] * length
    
    # 从左到右遍历,记录到左侧最近0的距离
    for i in range(length):
        if lst[i] == 0:
            dist[i] = 0
        elif i > 0:
            dist[i] = dist[i-1] + 1
    
    # 从右到左遍历,更新到右侧最近0的距离,取左右距离的最小值
    for i in range(length-2, -1, -1):
        dist[i] = min(dist[i], dist[i+1] + 1)
    
    return dist

# 测试示例
test_lst1 = [2, 1, 0, 3, 5]
print(nearest_zero_distance(test_lst1))  # 输出: [2, 1, 0, 1, 2]

test_lst2 = [0, 2, 0, 4, 1, 0]
print(nearest_zero_distance(test_lst2))  # 输出: [0, 1, 0, 1, 1, 0]

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

直观解决方案:收集0的索引再计算

如果追求逻辑简单,可先收集所有0的位置,再逐个计算每个元素到这些0的最小距离:

def nearest_zero_distance(lst):
    zero_indices = [i for i, val in enumerate(lst) if val == 0]
    dist = []
    for idx in range(len(lst)):
        # 计算当前索引到每个0的距离,取最小值
        min_dist = min(abs(idx - z_idx) for z_idx in zero_indices)
        dist.append(min_dist)
    return dist

# 测试示例
test_lst = [1, 0, 3, 0, 5]
print(nearest_zero_distance(test_lst))  # 输出: [1, 0, 1, 0, 1]

这种方法逻辑易懂,但时间复杂度为O(n*m)(m为0的数量),当列表极大且0较多时,效率不如两次遍历法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:33:34