嵌套循环效率Python

时间:2018-02-09 19:50:24

标签: python

def sum67(nums):
  for i in range(0, len(nums)): 
    print nums[i]
    if nums[i] == 6:
      nums[i] = 0
      for j in range(i+1, len(nums)):
        print nums[j]
        temp = nums[j]
        nums[j] = 0
        if temp == 7: break
      i=j+1
  return sum(nums)      

我将列表中的所有数字与直接6到7块之间的数字相加。我的代码工作正常,但我很困惑为什么第一个循环似乎正在重置,即使我设置i = j + 1。

我想'跳过'对所有通过第二个'for'块的j执行第一个if语句,因为没有必要检查0 = 6。 我认为放i = j + 1会实现这一点,但是打印nums [i]语句仍然打印出0,对应于经过第二个'for'块的那些。这表明循环从它停止的地方继续而不是从j + 1开始。

例如,sum67([2,7,6,2,6,7,2,7])打印出对应于2,6,7的3个零。那么为什么循环不会从j + 1继续?

谢谢

1 个答案:

答案 0 :(得分:0)

我认为这就是你要找的东西:

def sum67(nums):
    include_next = True
    included_nums = []
    for i in nums:
        if include_next and i not in (6, 7):
            included_nums.append(i)
        if i == 6:
            include_next = False
        if i == 7:
            include_next = True
    return sum(included_nums)

看来你过于复杂化了。不要害怕创建新的变量来跟踪状态,因为这些变量可以使代码更清晰,前提是你给出了解释其目的的名称(你应该总是这样做)。在循环遍历列表时修改列表通常也是一个非常糟糕的主意。

更简洁的解决方案是创建一个可重复使用的功能,现在你的功能有一个名称可以解释它的目的(你也应该总是这样做):

def sum_excluding(nums, start, end):
    include_next = True
    included_nums = []
    for i in nums:
        if include_next and i not in (start, end):
            included_nums.append(i)
        if i == start:
            include_next = False
        if i == end:
            include_next = True
    return sum(included_nums)

def sum_excluding_6_to_7(nums):
    return sum_excluding(nums, 6, 7)