Нужно добавить несколько списков в один, но в reverse состоянии

def data_reverse(data):
    
    chunk_size = 8

    splitted_list = list()

    for i in range(0, len(data), chunk_size):
        a = data[i:i+chunk_size]
        splitted_list.append(a)
    b = splitted_list[::-1]
    print()

data_reverse([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])

Есть такой код. Нужно чтобы массив делился на несколько массивов по 8 элементов. Но должны быть в reverse.То есть [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] => [[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16]] => [[9,10,11,12,13,14,15,16],[1,2,3,4,5,6,7,8]] => [9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8] P.S без библиотек


Ответы (4 шт):

Автор решения: RottenRat

Думаю, этот код Вам поможет

chuck_size = 8

def list_swap(my_list : list, chank_size : int) -> list:
    func_list = my_list.copy()
    new_list = []
    last_i = 0
    for i in range(chank_size,len(my_list),chank_size):
        new_list.append(func_list[last_i:i])
        last_i = i
    else:
        new_list.append(func_list[i:len(my_list)])
    func_list = []
    for i in range(len(new_list)-1, -1,-1):
        func_list.extend(new_list[i])
    return func_list

test = list_swap([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17], chuck_size)
print(test)

Объясняю:

func_list = my_list.copy()

Копирую старый список, чтобы ничего случайно там не изменить (тк список ссылочный тип)

for i in range(chank_size,len(my_list),chank_size):
        new_list.append(func_list[last_i:i])
        last_i = i

Разбиваю список на подсписки размером chank_size

else:
    new_list.append(func_list[i:len(my_list)])

После цикла додобавляю лишние элементы

   for i in range(len(new_list)-1, -1,-1):
        func_list.extend(new_list[i])

Просто записываю элементы списка в обратном порядке. Заметьте, я использую для этого extend, чтобы в итоге получился единый список без подсписков

В конце просто возвращаю получившийся список

→ Ссылка
Автор решения: splash58

Можно куски массива просто записать в обратном порядке

def data_reverse(data, chunk_size):
    splitted_list = list()
    for i in range(0, len(data), chunk_size):
        a = data[i:i + chunk_size]
        splitted_list = a + splitted_list
    return splitted_list


print(data_reverse([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 8))

# [9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8]
→ Ссылка
Автор решения: Алексей Р

Рекурсивный вариант

def data_reverse(lst, size=8):
    return data_reverse(lst[size:], size) + lst[:size] if len(lst) > size else lst

print(data_reverse(list(range(1, 17))))
[9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8]
→ Ссылка
Автор решения: Stanislav Volodarskiy

Самое простое решение. Единственный трюк это range(...)[::-1]. Можно написать reversed(range(...)):

def data_reverse(data, chunk_size=8):
    result = []
    for i in range(0, len(data), chunk_size)[::-1]:
        result.extend(data[i:i + chunk_size])
    return result
→ Ссылка