'Список индекса вне диапазона' при реверсировании списка - PullRequest
0 голосов
/ 05 августа 2020

Проблема связана с изменением списка A размера N в группах по K. Например, если A = [1,2,3,4,5], k = 3 Output = [3,2,1,5,4] Ошибка, которую я получаю, когда я запускаю, это List Index вне диапазона в строке 4 .

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

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Кажется, не удается воспроизвести вашу 'List index out of range' ошибку, но ваш logi c неисправен:

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]
1 голос
/ 05 августа 2020

Это реализует то, что вы пытаетесь достичь:

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).

0 голосов
/ 05 августа 2020

Вы можете перевернуть массив до индекса 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)
0 голосов
/ 05 августа 2020

Вы также можете попробовать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...