如何在python中成组反转数组

  • 本文关键字:数组 python python
  • 更新时间 :
  • 英文 :


我正在尝试分组反转数组,但我收到了以下错误:

:----  for i in arr: TypeError: 'NoneType' object is not iterable. 

我的代码出了什么问题?

def reverseSubarray(arr,n,k):
if k == 1:
return
i = 0
while i < n:
l = i
r = min(i+k-1, n-1)
while l < r:
temp = arr[l]
arr[l] = arr[r]
arr[r] = temp
l += 1
r -= 1
i += k
return arr

def main():
n = int(input().strip())
string  = input().strip().split()
arr=[]
for j in string:
arr.append(int(j.strip()))
k=int(input().strip())
arr = reverseSubarray(arr,n,k)
for i in arr:
print(i,end=' ')

if __name__ == "__main__":
main()

所以问题是您实际上返回了None。之所以会发生这种情况,是因为很可能您给出的是k=1,所以它将转到不返回任何内容的行,这将在尝试迭代时返回此错误。

您可以使用arr=reverseSubarray(arr,n,k)上的try-catch块来处理此问题,该块将返回类似k cannot be 1的消息

您可以在python中分组反转数组,如下所示,

def reverseSubarray(arr, N, K):
for i in range(0, len(arr),K):
l=arr[i:i+K]
l.reverse()
arr[i:i+K] =l
return arr

虽然正如其他答案所指出的,您的错误确实是由于函数返回None,但您也以非常非Python的风格编写了该函数。下面是一个如何更简洁地重写它的例子:

def reverseInGroups(self, arr, N, K):
for i in range(0, N, K):
arr[i:i+K] = reversed(arr[i:i+K])
return arr
  • range(0, N, K)将返回一个以K为步长从0到N-1的迭代器。换句话说,i将依次具有值:0、K、2K、3K、4K等,直到K的最后一个倍数小于N。以下是文档以了解更多详细信息
  • arr[i:i+K]将指代索引ii+K-1之间的arr的切片,或者换句话说,指代[arr[i], arr[i+1], arr[i+2], ..., arr[i+K-1]]。它在i+K-1处停止,因此您可以自然地使用arr[i:i+K]arr[i+K:],而无需对arr[i+K]计数两次
  • reversed。。。反转迭代器。这是医生

最新更新