Функция не действует на фрагмент списка в python - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь повернуть массив arr длиной n на d элементов. Я перевернул массив, а затем перевернул две части моего массива 0 to n-d и n-d to n, чтобы достичь результата.

from sys import stdin

def reverseArray(arr):
    for i in range(len(arr)//2):
        arr[i], arr[len(arr)-i-1] = arr[len(arr)-i-1], arr[i]
    return

def rotate(arr, n, d):
    reverseArray(arr)
    reverseArray(arr[0:n-d])
    reverseArray(arr[n-d:n])
    return

# Taking Input Using fast I/O
def takeInput() :
    n = int(stdin.readline().rstrip())
    if n == 0:
        return list(), 0

    arr = list(map(int, stdin.readline().rstrip().split(" ")))
    return arr, n


#to print the array/list 
def printList(arr, n) : 
    for i in range(n) :
        print(arr[i], end = " ")
    print()


#main
t = int(stdin.readline().rstrip())

while t > 0 :
    
    arr, n = takeInput()
    d = int(stdin.readline().rstrip())
    rotate(arr, n, d)
    printList(arr, n)
    
    t -= 1

Вход:

1 # Test cases
6 # n
1 3 6 11 12 17 # elements of arr
4 # d

Выход:

Мой результат

17 12 11 6 3 1 

Ожидаемый результат

12 17 1 3 6 11 

Я не понимаю, почему моя обратная функция работает для всего массива, а не для его частей. Поскольку списки изменяемы, я считаю, что моя функция должна изменять срезы.

Это работает, когда я назначаю срез переменной, а затем снова присваиваю срезу обратное значение.

def rotate(arr, n, d):
    reverseArray(arr)
    
    fp = arr[0:n-d]
    sp = arr[n-d:n]
    
    reverseArray(fp)
    arr[0:n-d] =  fp
    
    reverseArray(sp)
    arr[n-d:n] = sp
    
    return
...