【问题标题】:How to ignore numbers after specific number in the list/array in Python?python - 如何忽略Python列表/数组中特定数字之后的数字?
【发布时间】:2020-09-24 01:14:00
【问题描述】:

我被这个问题困住了:

我试图返回数组中数字列表的总和,忽略以 6 开头并延伸到下一个 9 的数字部分(每个 6 后面至少有一个 9)。没有数字则返回 0。

这是我的测试用例:

number_69([1, 3, 5]) --> 9
number_69([4, 5, 6, 7, 8, 9]) --> 9
number_69([2, 1, 6, 9, 11]) --> 14

我想出了类似的东西:

def number_69(arr):
   for num in arr:
     if 6 not in arr and 9 not in arr:
        return sum(arr)
     return 0

【问题讨论】:

    标签: python arrays for-loop sum


    【解决方案1】:
    def summer_69(arr):
        pop = []
        for i in arr:
            if i <=9 and i>=6:
                continue
            else:
                pop.append(i)
        return pop
    

    【讨论】:

      【解决方案2】:

      您可以迭代地切出 6 和 9 之间的部分,直到没有更多对,然后对余数调用 sum。

      对于“切片”,我们使用 Python 的索引切片,它通过给出开始索引和结束索引(不包括在内)来工作。

      >>> [0, 1, 2, 3][1:3] == [1, 2]
      True
      >>> [0, 1, 2, 3][1:]
      [1, 2, 3]
      >>> [0, 1, 2, 3][:2]
      [0, 1]
      

      我们用list.index 找到前 6 个和后 9 个的位置。我们必须确保只在 6 之后才开始寻找 9。这给出了

      def number_69(arr):
          while 6 in arr:
              index = arr.index(6)
              arr = arr[:index] + arr[index + arr[index:].index(9) + 1:]
              # +index because we are removing it from arr[index:]
              # +1 because we don't want to include the 9 in the new list
          return sum(arr)
      

      由于我们知道每个 6 后面都会跟着一个 9,所以没有必要检查列表中是否有 9。因此,此函数将删除所有6-9 块,然后才返回整个列表的总和。

      如果 6 没有伴随的 9,则此函数将引发 ValueError。这可以通过检查 9 来解决,但这必须在前 6 的索引之后完成。如果没有找到 9,我们还必须将 break 退出循环,因为 6 不会被删除.

      def number_69(arr):
          while 6 in arr:
              index = arr.index(6)
              if 9 in arr[index:]:
                  arr = arr[:index] + arr[index + arr[index:].index(9) + 1:]
                  # +index because we are removing it from arr[index:]
                  # +1 because we don't want to include the 9 in the new list
              else:
                  break
          return sum(arr)
      

      【讨论】:

      • 我想过使用 slice() 函数/方法,但我不知道如何在我的代码中实现。谢谢哥们!
      • 这会进行很多列表遍历,可能不适合较长的输入
      • @Cireo 感谢您指出这一点!你是绝对正确的。我在list(range(10))*1000000 上针对其他两个答案对其进行了测试,但该解决方案无法很好地扩展。事实上,我不得不将它降低到list(range(10))*10000,尽管其他解决方案可以在一秒钟或更短的时间内完成所有十亿次运行。至少我可以在切片方面提供帮助,但是如果您考虑到大量列表,则此答案不起作用。
      【解决方案3】:

      另一个尝试,使用list.pop

      lst = [4, 5, 6, 7, 8, 9]
      
      def summer_69(lst):
          s = 0
          while lst:
              i = lst.pop()
              if i == 9:
                  while i!=6:
                      i = lst.pop()
              else:
                  s += i
          return s
      
      print(summer_69(lst))
      

      打印:

      9
      

      【讨论】:

      • 很好,我会根据你的解决方案来玩。
      【解决方案4】:

      我想当我们看到 6 时我们停止添加,当我们看到 9 时我们重新开始

      def number_69(arr):
          sum = 0
          stop = False
          for num in arr:
              if num == 6:
                  stop = True
              elif num == 9:
                  stop = False
              elif stop is False:
                  sum = sum + num
          return sum
      
      print(number_69([2, 1, 6, 9, 11]))
      

      【讨论】:

      • 漂亮而简单的代码。我喜欢你在 #6 和 #9 之间使用 stop = False/True 的方式。谢谢,我学到了新东西。
      【解决方案5】:

      顺便说一句,函数的好名字

      def summer_69(arr):
          toSum = True
          sum = 0
          for x in arr:
              if toSum :
                  if(x == 6):
                      toSum = False
                  else :
                      sum += x
              else :
                  if(x == 9):
                      toSum = True
          return sum
      

      希望有用

      【讨论】:

      • 使用 if/else 语句的好解决方案。我自己试试,谢谢!
      猜你喜欢
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2011-05-02
      • 2020-05-02
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多