【问题标题】:Number Filtration Algorithm bug数字过滤算法错误
【发布时间】:2020-01-08 01:10:02
【问题描述】:

所以我写了这个算法,给定一组整数,它会删除除 0 和 7 之外的所有整数,然后它会检查剩余的整数是否按特定顺序,然后返回一个布尔值。代码如下:

def spy_game(nums):
  for i in nums:
    if i != 0:
      if i == 7:
        continue
      else:
        nums.remove(i)
    else:
      continue
  stringlist = [str(o) for o in nums]
  mystring = ''.join(stringlist)
  return '007' in mystring

spy_game([1,0,2,4,0,7,5])

现在的问题是,如果我运行 (例如)spy_game([1,0,2,4,0,7,5]) 它不会返回True,无论是否存在感兴趣的序列。在我决定在过滤过程之后返回列表本身之后,我发现除了中间的数字之外的所有数字都被过滤掉了。所以在这个例子中,如果我 return nums 它将返回 [0, 4, 0, 7] 尽管 4 应该已经被删除。我知道这个算法有更多的最佳替代方案,但我只是想了解它为什么不起作用。谢谢你。

【问题讨论】:

  • 您可能需要修复缩进,因为代码无法正常工作
  • 代码不起作用,因为您在迭代 nums 数组本身时对其进行了更新,请使用另一个数组从中删除内容。就像假设您的循环 i 值为 0,并且您的第一个元素在第 0 处为 1,现在当您删除它时,i 变为 1 而不是在 1 处我们的值为 2,因为删除 1 后,我们的数组变为 - [0, 2,4,0,7,5].
  • @zenwraight 考虑把它写成答案,很好地解释了
  • @Jimmar 你已经这样做了,所以赞成:)

标签: python algorithm logic


【解决方案1】:

不要修改列表,而是使用另一个列表来跟踪想要的数字。

你不应该在迭代列表时修改它。

这是一个干净的版本

def spy_game(nums):
    ans = []
    for i in nums:
        if i == 0 or i == 7:
            ans.append(i)

    stringlist = [str(o) for o in ans]
    mystring = ''.join(stringlist)
    return '007' in mystring

【讨论】:

    【解决方案2】:

    zenwraight's comment什么问题是:在 Python 中,您不能在迭代列表时修改它。

    至于为什么,Python 文档在a notethe for statement's section 上讨论了这一点:

    内部计数器用于跟踪接下来使用哪个项目,并且在每次迭代时递增。 ... 这意味着如果 [循环体] 从序列中删除当前 ... 项,则将跳过下一项(因为它获取了已处理的当前项的索引)。

    该文档还描述了在循环期间插入元素时会发生什么,并提出了一种可能的解决方案(使用切片复制列表:for i in nums[:]: ...)。在您的用例中,该解决方案可能运行良好,但与不复制整个列表的选项相比,它的效率要低得多。

    更好的解决方案可能是使用另一个列表推导:

    nums = [i for i in nums if i == 0 or i == 7]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多