【问题标题】:How to check index values in a loop without incrementing the index? [duplicate]如何在不增加索引的情况下循环检查索引值? [复制]
【发布时间】:2021-11-04 12:52:24
【问题描述】:

挑战来自于 codingbat - 对数组的元素求和,除了 6 和 7 之间的所有值,也不计算 6 或 7。

我的策略是创建一个新数组“有效”并将数组 nums 的有效元素附加到“有效”数组,然后对有效数组求和。

因为一旦检测到 6,我需要索引来检查 7,所以我的计划是枚举数组,当找到值 6 时,循环遍历数组的其余部分,直到找到 7,而不是在进程中将值 6-7 附加到数组“有效”。

我通过 MIT Python 辅导员运行我的代码,看看哪里出了问题,当我在 i+1 != 7 之后增加索引时(目的是检查数组中的下一个值是否是7) 它增加索引(它完成了对数组索引的处理并移动到下一个,而不是坚持 6 的代码并继续循环并检查 7)。

感谢任何帮助,尤其是坚持原始策略但在代码中正确实施的解决方案。

def sum67(nums):
  valid = []
  for i,c in enumerate(nums):
    if c == 6:
    #when a 6 comes up
      if  nums[i+1] == 7:
      #if the next number is a 7
        i+=1
        break
        #increment and break
      else:
        i+=1
        #increment
    else:
      valid.append(c)
  return sum(valid)
        
sum67([1, 2, 2, 6, 99, 99, 7])

编辑 1: 所需的输出

sum67([1, 2, 2, 6, 99, 99, 7])

是 5。(因为 1 + 2 + 2 = 5,而 6、99、99 和 7 被排除在外,因为它们是或介于 6 和 7 之间)

【问题讨论】:

  • 当您说:except for all values between 6 and 7 时,您指的是值,即不是索引吗?
  • 请举例说明您从给定输入中寻找的输出。
  • 重复 - stackoverflow.com/questions/57484048 建议 close 它。

标签: python


【解决方案1】:

使用迭代器和成员检查来搜索并跳到 7 之后:

def sum67(nums):
    it = iter(nums)
    return sum(x for x in it if x != 6 or 7 not in it)

这会遍历每个数字,并且通常(如果不是 6)将其包含在总和中。如果它 6,则搜索下一个 7,并且不要将其中任何一个包含在总和中(然后在 7 之后继续下一次迭代)。

编辑:Ermahgerd... CodingBat 可笑地以某种方式删除了iter(说'iter' is not defined),尽管它是 Python 中最基本的内置函数之一。哦,好吧,我们可以改用 genexp,它在那里被接受:

def sum67(nums):
    it = (x for x in nums)
    return sum(x for x in it if x != 6 or 7 not in it)

【讨论】:

  • 优雅而聪明!
  • 看起来很蟒蛇!但是您介意解释一下这实际上是如何工作的吗?
  • @rabunc 好的,添加了更多解释。
【解决方案2】:

您可以这样做以避免创建额外的数组:

def sum67(nums):
    isWithin67 = False
    totalSum = 0
    for n in nums:
        if n == 6:
            isWithin67 = True
            continue

        if n == 7:
            isWithin67 = False
            continue

        if isWithin67:
            continue

        totalSum += n

    return totalSum

【讨论】:

  • 谢谢 Inogueir,您认为循环方法中的循环不适用于这个挑战吗?
  • @rabunc Np。在我看来,如果你可以选择不嵌套循环,我会一直走这条路,除非代码更难看,这里不是这种情况。但是,您当然可以找到解决此问题的嵌套循环方法。
【解决方案3】:

您可以简单地通过标记列表当前是否在 6 到 7 之间来实现这一点:

def sum67(nums):
    valid = []
    include = True
    for c in nums:
        if c == 6:
            include = False
        if include:
            valid.append(c)
        if c == 7:
            include = True
    return sum(valid)

print(sum67([1, 2, 2, 6, 99, 99, 7]))

按要求输出

【讨论】:

  • 谢谢 quamrana,当我研究这个问题的答案时,我确实看到了标记解决方案,这就是我今后的工作方式。我想我在这里发帖是因为我很想知道我的方法是否丢失了,或者是否有可行的方法在循环方法中实现循环。
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2020-04-06
  • 2021-12-01
相关资源
最近更新 更多