【问题标题】:(python) Can you please tell me what is the problem in the code below(python)你能告诉我下面的代码有什么问题吗
【发布时间】:2021-07-17 13:31:47
【问题描述】:

刚开始学python,遇到一个问题:

arr = [1,3,3,3,0,1,1]
def solution(arr):  
    a=[]
    for r in range(len(arr)-1):
        if arr[r] == arr[r+1]:
            a.append(r+1)
    print(a)
    for i in range(len(a)):
        k = int(a[i])
        arr[k] = -1
        arr.remove(-1)
    return arr

有消息

IndexError: list index out of range for ''arr[k] = -1''

你能告诉我错误的原因并纠正它吗?

【问题讨论】:

  • 在那个循环中打印arr和k的值,就清楚了。
  • 你能告诉你你想在这里做什么吗?你期望什么作为输出?你的代码打算做什么?
  • 代码应该做什么?
  • 我想删除连续相同的数字,所以我希望代码返回 [1,3,0,1]
  • 应该是[1,3,3,0,1]?

标签: python list indexing


【解决方案1】:

当然,它会导致运行时异常。列表a 存储索引。对于a 中的每个元素v,您正在尝试删除值arr[v]。这样做将每次将arr 的大小减小一。因此,在下一次迭代中,v 可以大于arr 的大小。因此,它会导致 List index out of bound 异常。

您的代码,已更正:

arr = [1,3,3,3,0,1,1]
def solution(arr):  
    a=[]
    for r in range(len(arr)-1):
        if arr[r] == arr[r+1]:
            a.append(r+1)
    print(a)
    c = 0
    for i in range(len(a)):
        k = int(a[i])
        arr[k - c] = -1
        arr.remove(-1)
        c += 1
    return arr
    
print(solution(arr))

您似乎正在尝试从列表中删除连续的重复项。这可以使用以下代码轻松解决。

def remove_duplicates(arr):
    stack = [arr[0]]
    for i in range(1, len(arr)):
        if stack[-1] != arr[i]:
            stack.append(arr[i])
    return stack

print(remove_duplicates([1,3,3,3,0,1,1]))

【讨论】:

    【解决方案2】:

    简而言之,当您根据未修改的数组确定索引以对其进行索引时,您无法修改数组形状。

    您可能正在寻找以下内容:

    def solution(arr):
        a = []
        for r in range(len(arr) - 1):
            if arr[r] == arr[r + 1]:
                a.append(r + 1)
        print(a)
        for i in range(len(a)):
            k = int(a[i])
            arr[k] = -1
    
            # In the following line, you cannot modify the array length
            # when you have already computed the indices based on the unmodified array
            # arr.remove(-1)
        arr = [x for x in arr if x != -1]  # This is a better way to deal with it
        return arr
    
    
    print(solution(arr=[1, 3, 3, 3, 0, 1, 1]))
    

    【讨论】:

      【解决方案3】:

      您不想弄乱原始列表。否则你会遇到索引错误。索引错误意味着您在列表中查找的项目不再存在。这条线很可能是罪魁祸首arr.remove(-1)

      arr = [1,3,3,3,0,1,1]
      
      solution = []
      for i, v in enumerate(arr):
          if i == 0 or v != arr[i -1]:
              solution.append(v)
          
      print(solution)
      

      这应该会让你得到你所追求的。 enumerate 告诉您在循环列表时想要您所在的索引。更多信息可以在这里找到:https://realpython.com/python-enumerate/

      【讨论】:

        【解决方案4】:

        好吧,你可能已经知道这里出了什么问题,删除loop中的元素:

        for i in range(len(a)):
            k = int(a[i])
            arr[k] = -1
            arr.remove(-1)
        

        您可以修复整个事情,只需将行更改为此列表过滤器+lambda实现,嗯,不是在循环内部,而是在循环迭代完成后,如下所示:

        for i in range(len(a)):
            k = int(a[i])
            arr[k] = -1
        arr = list(filter(lambda x: x != -1, arr))
        

        您将从您的解决方案中得到您想要的!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 2019-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多