我正在尝试分组反转数组,但我收到了以下错误:
:---- 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]
将指代索引i
和i+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
。。。反转迭代器。这是医生