【问题标题】:How to start a for loop from the end of a vector, and at the value 0 do something如何从向量的末尾开始一个 for 循环,并在值 0 处执行某些操作
【发布时间】:2021-01-21 19:45:42
【问题描述】:

我必须开始将向量从其末端循环到零。当我遇到值 0 时,我需要将其替换为 三个 预览值的总和。例外情况是遇到第一个零,我只需要将前两个值相加即可。

例如

v = [0, 5, 5, 0, 6, 6, 0, 7, 7 ]

预期结果:

v = [36, 5, 5, 26, 6, 6, 14, 7, 7 ]

代码

for i in range(len(v), 0):       
    if v == 0 :
        v[i] = v[i+1] + v[i+2] + v[i+3]

代码不工作。我哪里错了?

【问题讨论】:

  • if v == 0 : 是错误的。 v[i] = v[i+1] + v[i+2] + v[i+3]i >= len(v) - 3 是错误的。 sum(v[i+1:i+3]) 可以在这里提供帮助。
  • range(len(v), -1, -1)
  • 尝试 v[::-1] 使列表向后排序
  • @ArthurHarduim 这在这里没用,因为他分配给列表元素并且需要索引反向。

标签: python arrays loops for-loop


【解决方案1】:

您可以使用sum(v[i+1:i+4]) 避免索引错误。您必须比较每个元素 (if v[i] == 0) 而不是整个列表。

v = [0, 5, 5, 0, 6, 6, 0, 7, 7 ]

for i in range(len(v) - 1, -1, -1):       
    if v[i] == 0 :
        v[i] = sum(v[i+1:i+4])
print(v)

【讨论】:

  • 无论如何,我调试了你的代码,但我仍然不确定你的解决方案。它有效,但我不明白为什么。我无法理解 sum(v[i+1:i+4]) 尤其是 +4。最多不应该+3?
  • @chrisis 因为切片 ([i+1:i+4]) 在左侧是包容性的,而在右侧是独占性的。这些元素最多为 3 个,而不是 4 个。v[i:i] 是一个空列表。
【解决方案2】:

您可以在reversed 列表上使用itertools.accumulate 获取总和,然后在原始存在0 的位置切换到总和-

from itertools import accumulate

acc = list(accumulate(reversed(v)))  #list of cumsums
sums = [j if i==0 else i for i,j in zip(reversed(v), acc)]  #switch to cumsum where 0 exists in list
out = list(reversed(sums))  #reverse it back
print(out)
[36, 5, 5, 26, 6, 6, 14, 7, 7]

【讨论】:

  • 再次感谢,但对我来说太复杂了 :) 再次感谢您的帮助
  • 很高兴为您提供帮助。试试看你是否也理解这种方法!如果您正在学习,从长远来看会有所帮助:)。 Itertools 是一组强大的方法,而列表推导式是编写循环的 Python 方式!
【解决方案3】:
v = [0, 5, 5, 0, 6, 6, 0, 7, 7 ]

for i in range(len(v)-4,-1,-1):
    if v[i] == 0 :
        v[i] = v[i+1] + v[i+2] + v[i+3]

print(v)

这正是你想要的。但是最后 3 中的零不会被修改,因为没有其他 3 可以添加。结果是

[22, 5, 5, 12, 6, 6, 0, 7, 7]

【讨论】:

  • 感谢@FLAW 的贡献!请检查输出是否与 OP 预期的不同。请更新您的答案,谢谢!
  • 我的男人,这个标志是干什么用的?我有一个解决方案,是的,有一个更好的解决方案@Thomas Sablik。添加最后 3 个时缺少地雷。但我认为这不值得一个标志。我尝试了这个问题,得到了解决方案。并且您标记 bc 我的解决方案并不完美哈?
  • 我没有标记或否决我的朋友。随时查看我的个人资料。我只是礼貌地评论,我不会专门为新用户投反对票:)
  • 我认为问题在于你的输出而不是你的方法[22, 5, 5, 12, 6, 6, 0, 7, 7]... OP 期待v = [36, 5, 5, 26, 6, 6, 14, 7, 7 ]。有些人对此表示反对,但不要气馁。我们都会不时面对它
  • 谢谢你!在我的第一个答案中遇到这样一个有礼貌的人感到很幸运。和一位在人工智能和机器学习方面拥有 8 年以上经验的数据科学家......简直佩服,伙计 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多