如何计算列表中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
相关产品推荐
相关产品推荐

