【问题标题】:Function does not remove second integer函数不删除第二个整数
【发布时间】:2020-04-28 17:02:13
【问题描述】:
    def sumUp(array):
        for row in array:
            if row > 5:
                array.remove(row)
        add = sum(array)
        return add

数组是[1, 20, 20, 5, 50, 2, 2, 1]

返回的数组是[1, 20, 5, 2, 2, 1]

我想知道我哪里出错了,因为 20 仍在数组中。

【问题讨论】:

  • 因为你删除了,所以当前索引变成了下一个。所以下一个从未检查过
  • 感谢您的回答!他们都解决了我的问题,也让我明白出了什么问题:)

标签: python arrays function


【解决方案1】:

这是因为您要从正在迭代的列表中删除元素。

您可以使用列表推导来创建一个仅包含您不想删除的元素的新列表:

def sumUp(array):
    array = [x for x in array if x <= 5]
    add = sum(array)
    return add

【讨论】:

  • 我不确定修改原始参数是由 OP 决定的,还是计划外的副作用。无论如何,您的代码不会这样做。
【解决方案2】:

替换

for row in array:

for row in array[:]:

这样您将遍历array 的副本,removes 不会修改该副本。

【讨论】:

    【解决方案3】:

    这是因为 Python 迭代集合的方式。在功能上,for value in collection 构造在该集合上运行 hidden 位置指针,每次增加一个:

    for hidden in range(0, len(collection)):
    

    这意味着,如果您在当前位置或之前删除集合中的任何内容,下一次迭代将跳过一个元素。例如,如果您在位置 3:

          v
    0 1 2 3 4 5 6
    a b c d e f g
    

    然后你删除它,你会得到:

          v
    0 1 2 3 4 5
    a b c e f g
    

    然后下一次迭代将完全跳过e,因为它推进了指针:

            v
    0 1 2 3 4 5
    a b c e f g
    

    现在这可能不是 Python 在幕后工作的方式,而是它在功能上的工作方式。这就是为什么修改您正在迭代的列表通常不是一个好主意的原因。

    就解决方案而言,这取决于您是否尝试修改原始列表。如果你是,你可以只返回一个新列表和总和的元组,类似于:

    def sumUp(array):
        newArr = [item for item in array if item <= 5]
        return (sum(newArr), newArr)
    

    并调用它:

    (sumOfSmalls, array) = sumUp(array)    
    

    如果您只想要特定值的总和而不更改数组,那会容易得多:

    def sumUp(array):
        return sum([item for item in array if item <= 5])
    

    我什至会考虑不为此创建一个函数,因为它在调用代码中很简单。

    【讨论】:

      【解决方案4】:

      当你删除时,你会跳过下一个元素,所以反过来

      def sumUp(array):
              for i,row in enumerate(reversed(array)):
                  if row > 5:
                      array.remove(row)
              print(array)
              add = sum(array)
              return add
      ar = [1, 20, 20, 5, 50, 2, 2, 1]
      sumUp(ar)
      
      [1, 5, 2, 2, 1]
      11
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 2016-11-08
        • 1970-01-01
        相关资源
        最近更新 更多