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

如何计算列表中1的索引间距(含循环环绕场景)

计算列表中1的循环索引间距解决方案

看起来你需要解决的是从0/1列表中计算所有1之间的索引间距,包括最后一个1循环回到第一个1的情况。先拿你的示例[1, 0, 0, 1, 1, 0, 1, 0, 0, 0]来说,1的索引是[0, 3, 4, 6],对应的期望间距[3, 1, 2, 4]其实可以通过清晰的三步逻辑来实现,我们一步步来看:

核心思路

  • 先收集所有1的位置:遍历列表,把所有值为1的元素索引存起来,这是后续计算的基础。
  • 处理循环的相邻间距:对于每个1的索引,计算它到下一个1的距离;最后一个1的“下一个”就是第一个1,这里用模运算可以很优雅地处理循环逻辑。
  • 返回结果集合:把所有计算好的间距整理成列表返回。

你当前代码的问题

你的calc_dist函数逻辑有点绕,比如修改了原输入列表、计数逻辑没对齐需求,也没正确处理最后一个1循环到第一个的情况,所以得不到期望的结果。我们可以重新写一个更清晰的版本。

正确实现代码

def calc_dist(loc_c):
    # 第一步:提取所有值为1的元素索引
    ones_positions = [idx for idx, value in enumerate(loc_c) if value == 1]
    num_ones = len(ones_positions)
    
    # 处理特殊情况:没有1或者只有一个1
    if num_ones == 0:
        return []
    if num_ones == 1:
        # 单个1循环到自己的间距就是列表总长度
        return [len(loc_c)]
    
    distances = []
    total_length = len(loc_c)
    
    # 遍历每个1的位置,计算到下一个1的间距
    for i in range(num_ones):
        current = ones_positions[i]
        # 用模运算让最后一个元素的下一个指向第一个元素
        next_pos = ones_positions[(i + 1) % num_ones]
        # 模运算自动处理循环的差值计算
        dist = (next_pos - current) % total_length
        distances.append(dist)
    
    return distances

# 测试你的示例
sample_list = [1, 0, 0, 1, 1, 0, 1, 0, 0, 0]
print(calc_dist(sample_list))  # 输出: [3, 1, 2, 4]

关键逻辑解释

  • 提取索引:列表推导式[idx for idx, value in enumerate(loc_c) if value == 1]快速收集所有1的位置,比循环计数更简洁高效。
  • 模运算处理循环:(i + 1) % num_ones确保当i是最后一个1的索引时,(i+1)会回到0(第一个1的索引);(next_pos - current) % total_length则自动处理两种场景:
    • 下一个1在当前1的后面(比如0→3):直接得到差值3;
    • 下一个1在当前1的前面(比如6→0):模运算会计算(0 - 6) % 10 = 4,正好是循环后的间距。
  • 边界情况处理:考虑了没有1或者只有一个1的情况,避免程序出现索引错误。

这样就能准确得到你想要的结果了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:27