Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数字过滤算法错误_Python_Algorithm_Logic - Fatal编程技术网

Python 数字过滤算法错误

Python 数字过滤算法错误,python,algorithm,logic,Python,Algorithm,Logic,所以我写了这个算法,给定一组整数,它将删除除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 nu

所以我写了这个算法,给定一组整数,它将删除除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_游戏([1,0,2,4,0,7,5])
无论兴趣序列是否存在,它都不会返回
True
。在我决定在过滤过程之后返回列表之后,我发现除了中间的所有数字都被过滤掉了。因此在本例中,如果我
返回nums
,它将返回
[0,4,0,7]
,尽管4应该被删除。我知道这个算法有更多的最佳选择,但我只是想了解为什么它不起作用。多谢各位

不要修改列表,而是使用另一个列表来跟踪想要的号码

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

这是一个清理过的版本

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

不要修改列表,而是使用另一个列表来跟踪想要的号码

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

这是一个清理过的版本

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
说明问题所在:在Python中,不能在迭代列表时修改列表

至于原因,Python文档将在以下方面进行讨论:

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

文档还描述了在循环过程中插入元素时发生的情况,并建议了一种可能的解决方案(使用切片复制列表:
for i in nums[:]:…
)。在您的用例中,该解决方案可能运行良好,但它的效率远远低于不复制整个列表的选项

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

nums = [i for i in nums if i == 0 or i == 7]
说明问题所在:在Python中,不能在迭代列表时修改列表

至于原因,Python文档将在以下方面进行讨论:

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

文档还描述了在循环过程中插入元素时发生的情况,并建议了一种可能的解决方案(使用切片复制列表:
for i in nums[:]:…
)。在您的用例中,该解决方案可能运行良好,但它的效率远远低于不复制整个列表的选项

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

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

您可能需要修复缩进,因为按原样编写的代码不起作用。代码不起作用是因为您在迭代nums数组时正在更新nums数组本身,请使用另一个数组从中删除内容。比如说,你的循环i值是0,而你的第一个元素在零是1,现在当你移除它时,我变成了1,而不是在1的位置,我们有值2,因为在移除1之后,我们的数组变为-[0,2,4,0,7,5]。explained@Jimmar你已经做到了,因此,您可能需要修复缩进,因为按原样编写的代码不起作用。代码不起作用,因为您在迭代nums数组时正在更新nums数组本身,请使用另一个数组从中删除内容。比如说,你的循环i值是0,而你的第一个元素在零是1,现在当你移除它时,我变成了1,而不是在1的位置,我们有值2,因为在移除1之后,我们的数组变为-[0,2,4,0,7,5]。explained@Jimmar你已经这么做了,所以投了更高的票:)