【问题标题】:'List index out of range' while reversing list反转列表时“列表索引超出范围”
【发布时间】:2020-11-25 20:30:11
【问题描述】:

问题是关于在 K 组中反转大小为 N 的列表 A。例如,如果 A = [1,2,3,4,5]k = 3 Output = [3,2,1,5,4] 当我运行它时,我得到的错误是第 4 行的 List Index out of range 。

def reverseInGroups(A,N,K):   
    arr1 = []
    for i in range(K):
        arr1.append(A[(N-i)%K]) #line 4
    for j in range(N-K):
        arr1.append(A[N-j-1])
    return arr1

【问题讨论】:

  • 没有可重现的错误? print(reverseInGroups([1,2,3,4,5],5, 3)) => [3, 2, 1, 5, 4]

标签: python python-3.x arraylist


【解决方案1】:

这将实现您想要实现的目标:

def reverseInGroups(A,K):
    N = len(A)
    arr1 = []
    for i in range(0, N, K):
        arr1.extend(A[i : i+K][::-1])
    return arr1

print(reverseInGroups([1,2,3,4,5], 3))

有趣的是,问题中的代码实际上在示例案例中有效,但并不通用。它起作用的情况是 N = 2*K - 1 (尽管它不起作用,元素的顺序错误,而不是 IndexError)。

【讨论】:

    【解决方案2】:

    似乎无法重现您的'List index out of range' 错误,但您的逻辑有问题:

    reverseInGroups(A,N,K):   
        arr1 = []
        for i in range(K):
            arr1.append(A[(N-i)%K]) #line 4
        for j in range(N-K):
            arr1.append(A[N-j-1])
        return arr1
    
    print(reverseInGroups([1,2,3,4,5],5, 3))  # works, others get wrong result
    print(reverseInGroups([1,2,3,4,5,6],6, 3))  # wrong result: [1, 3, 2, 6, 5, 4]
    

    打印:

    [3, 2, 1, 5, 4] # correct
    [1, 3, 2, 6, 5, 4] # wrong
    

    您可以通过将其打包到列表理解中来解决此问题并使其更小:

    def revv(L,k): 
        return [w for i in (L[s:s+k][::-1] for s in range(0,len(L),k)) for w in i]
    
    for gr in range(2,8):
        print(gr, revv([1,2,3,4,5,6,7,8,9,10,11],gr))
    

    得到:

    2 [2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 11]
    3 [3, 2, 1, 6, 5, 4, 9, 8, 7, 11, 10]
    4 [4, 3, 2, 1, 8, 7, 6, 5, 11, 10, 9]
    5 [5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 11]
    6 [6, 5, 4, 3, 2, 1, 11, 10, 9, 8, 7]
    7 [7, 6, 5, 4, 3, 2, 1, 11, 10, 9, 8]
    

    【讨论】:

      【解决方案3】:

      你也可以试试这个:

      def reverse(l, n):
          result = []
          for i in range(0, len(l)-1, n):
              for item in reversed(l[i:i+n]):
                  result.append(item)
          for item in reversed(l[i+n:]):
              result.append(item)
          return result
      

      【讨论】:

        【解决方案4】:

        您可以将数组反转到索引K 并将剩余部分反转并添加这两个数组。

        def reverseInGroups(A,N,K):
            return A[:K][::-1]+A[K:][::-1]
        
        A = [1,2,3,4,5]
        N = 5
        K = 3
        
        res = reverseInGroups(A,N,K)
        print(res)
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 1970-01-01
          • 2018-06-07
          • 2018-12-16
          • 2011-06-14
          • 2016-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多