Циклический сдвиг
Выполнить циклический сдвиг в списке целых чисел на указанное число шагов. Сдвиг также должен быть кольцевым, то есть элемент, вышедший за пределы списка, должен появляться с другого его конца.
Решение задачи на языке программирования Python
Для решения этой задачи можно воспользоваться следующими методами списка:
- append — добавляет элемент в конец списка,
- insert — вставляет элемент по указанному индексу,
- pop — извлекает элемент с конца списка или, если был передан индекс, по индексу.
Пусть наша функция shift в качестве аргументов принимает список и количество шагов сдвига. Если шаги представлены положительным числом, то сдвиг выполняется вправо, то есть надо извлечь последний элемент и добавить его в начало.
Если шаги — отрицательное число, то будем выполнять сдвиг справа налево, то есть надо извлечь первый элемент и добавить его в конец.
def shift(lst, steps): if steps 0: steps = abs(steps) for i in range(steps): lst.append(lst.pop(0)) else: for i in range(steps): lst.insert(0, lst.pop()) nums = [4, 5, 6, 7, 8, 9, 0] print(nums) shift(nums, -2) print(nums) shift(nums, 3) print(nums)
[4, 5, 6, 7, 8, 9, 0] [6, 7, 8, 9, 0, 4, 5] [0, 4, 5, 6, 7, 8, 9]
Как сдвинуть элементы в массиве NumPy (с примерами)
Вы можете использовать один из следующих методов для смещения элементов в массиве NumPy:
Метод 1: сдвинуть элементы (сохранить все исходные элементы)
#shift each element two positions to the right data_new = np.roll (data, 2)
Способ 2: элементы сдвига (разрешить замену элементов)
#define shifting function def shift_elements (arr, num, fill_value): result = np.empty_like (arr) if num > 0: result[:num] = fill_value result[num:] = arr[:-num] elif num < 0: result[num:] = fill_value result[:num] = arr[-num:] else : result[:] = arr return result #shift each element two positions to the right (replace shifted elements with zero) data_new = shift_elements(data, 2, 0)
В следующих примерах показано, как использовать каждый метод на практике.
Метод 1: сдвинуть элементы (сохранить все исходные элементы)
В следующем коде показано, как использовать функцию np.roll() для сдвига каждого элемента в массиве NumPy на две позиции вправо:
import numpy as np #create NumPy array data = np.array([1, 2, 3, 4, 5, 6]) #shift each element two positions to the right data_new = np.roll (data, 2) #view new NumPy array data_new array([5, 6, 1, 2, 3, 4])
Обратите внимание, что каждый элемент был сдвинут на две позиции вправо, а элементы в конце массива просто переместились вперед.
Мы также могли бы использовать отрицательное число в функции np.roll() для сдвига элементов влево:
import numpy as np #create NumPy array data = np.array([1, 2, 3, 4, 5, 6]) #shift each element three positions to the left data_new = np.roll (data, -3) #view new NumPy array data_new array([4, 5, 6, 1, 2, 3])
Способ 2: элементы сдвига (разрешить замену элементов)
Мы также можем определить пользовательскую функцию для сдвига элементов в массиве NumPy и разрешить замену сдвинутых элементов на определенное значение.
Например, мы можем определить следующую функцию для сдвига элементов и замены любых сдвинутых элементов значением 0:
import numpy as np #create NumPy array data = np.array([1, 2, 3, 4, 5, 6]) #define custom function to shift elements def shift_elements (arr, num, fill_value): result = np.empty_like (arr) if num > 0: result[:num] = fill_value result[num:] = arr[:-num] elif num < 0: result[num:] = fill_value result[:num] = arr[-num:] else : result[:] = arr return result #shift each element two positions to the right and replace shifted values with zero data_new = shift_elements(data, 2, 0) #view new NumPy array data_new array([0, 0, 1, 2, 3, 4])
Мы также можем использовать отрицательное число в функции, чтобы сдвинуть элементы влево:
import numpy as np #create NumPy array data = np.array([1, 2, 3, 4, 5, 6]) #define custom function to shift elements def shift_elements (arr, num, fill_value): result = np.empty_like (arr) if num > 0: result[:num] = fill_value result[num:] = arr[:-num] elif num < 0: result[num:] = fill_value result[:num] = arr[-num:] else : result[:] = arr return result #shift each element three positions to the left and replace shifted values with 50 data_new = shift_elements(data, -3, 50) #view new NumPy array data_new array([ 4, 5, 6, 50, 50, 50])
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в NumPy:
Как сдвинуть элементы массива на 1 вправо python



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Python-сообщество
![]()
- Начало
- » Центр помощи
- » Циклический сдвиг массива
#1 Ноя. 16, 2016 22:41:58
valoroso Зарегистрирован: 2016-11-14 Сообщения: 14 Репутация: 0 Профиль Отправить e-mail
Циклический сдвиг массива
Добрый вечер. Решаю задачу на сайте
Напишите эффективную программу, которая будет циклически сдвигать заданный массив на k элементов вправо. Дополнительные массивы и рекурсию не использовать.
Входные данные
На вход программе сначала подаются значения n100 — количество элементов в массиве и k100. В следующей строке входных данных расположены сами элементы массива — целые числа, по модулю не превосходящие 30 000.
Выходные данные
Выдайте значения элементов массива после выполнения указанной операции.
Примеры
входные данные
5 3
5 4 3 2 1
выходные данные
3 2 1 5 4
Перепробовал, много разных кодов:
n, m = input().split() n = int(n) k = int(m) array = input().split() for i in range(len(array)): array[i] = int(array[i]) k=k%len(array) print(array[-k:] + array[:-k])
и с pop/ append
n, m = input().split() n = int(n) m = int(m) arr = input().split() for i in range(len(arr)): arr[i] = int(arr[i]) z = 0 while z m-1: x = arr.pop(0) print(x) arr.append(x) z+= 1 print(arr)
и даже такой
n, m = input().split()
n = int(n)
k = int(m)
array = input().split()
for i in range(len(array)):
array[i] = int(array[i])
k=k%len(array)
if k==len(array) or k == 0:
print(array)
else:
c = n - k
while c < n:
array.append(array[c])
c+=1
c = n - k
while c>=0:
array[c+k]=array[c]
c-=1
c = n - k
i = k - 1
while c < n:
array[i] = array.pop()
c+=1
i-=1
print(array)
Пишет - неправильный формат вывода.
В чем проблема? Кроме того, что неправильный формат) Где ошибка в коде. Или может я не так понял задание?
Отредактировано valoroso (Ноя. 16, 2016 22:43:02)