Циклический сдвиг
Выполнить циклический сдвиг в списке целых чисел на указанное число шагов. Сдвиг также должен быть кольцевым, то есть элемент, вышедший за пределы списка, должен появляться с другого его конца.
Решение задачи на языке программирования 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]
Python-сообщество
- Начало
- » Python для новичков
- » Чем сдвинуть пробелы в коде?
#1 Июнь 10, 2013 17:55:39
leonid_10 От: Зарегистрирован: 2010-03-28 Сообщения: 197 Репутация: 3 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Подскажите, кто-нибудь, пожалуйста!
Например, нужно 100 строчек кода сдвинуть влево на 20 пробелов. Чем или как? Сидеть морзянку выстукивать backspace? У меня очень большая функция с небольшими изменениями должна использоваться без пяти if. Можно, конечно, придумать пять if, но, программисты меня не поймут, ибо я взялся участвовать в международном проекте по доработке экспортёра из Блендера в Поврей
🙂
#2 Июнь 10, 2013 18:04:15
Shaman Зарегистрирован: 2013-03-15 Сообщения: 1369 Репутация: 88 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Воспользоваться нормальной IDE. Например Eclipse+Pydev.
#3 Июнь 10, 2013 18:38:37
leonid_10 От: Зарегистрирован: 2010-03-28 Сообщения: 197 Репутация: 3 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Shaman
Воспользоваться нормальной IDE. Например Eclipse+Pydev.
У меня линукс. Полсотни пакетов со словом Eclipse(при чём, абсолютно непонятно, какой из них — базовая гуёвина) и ни одного со словом Pydev.
Разумеется, с сайта в линукс PyDev не установится, как там пишется, URL ввести. Ага, и пароль рута, чтоб системная папка обновилась.
Похоже, что линукс брезгует нормальной IDE, хотя, говорят, что линукс программисты сделали сами для себя, то бишь для программистов.
А, что, только такое может в питон коде отступы двигать? 🙂
#4 Июнь 10, 2013 18:59:30
Shaman Зарегистрирован: 2013-03-15 Сообщения: 1369 Репутация: 88 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Если не можете сориентироваться, скачайте отсюда: http://www.eclipse.org/downloads/?osType=linux и установите плагин отсюда: http://www.aptana.com/downloads/start Предварительно убедитесь в наличии Java runtime.
#5 Июнь 10, 2013 22:36:42
leonid_10 От: Зарегистрирован: 2010-03-28 Сообщения: 197 Репутация: 3 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Shaman
Если не можете сориентироваться, скачайте отсюда
Я и тут не могу сориентироваться. Тут-то что нужно выбрать? Потолще(300М) или потоньше?
Наугад качну классик.
Тем не менее, спасибо.
И, всё же интересно, неужели нет модуля в питоне, с помощью которого можно бы было обработать строчки простым циклом,видящим пробелы?
Отредактировано leonid_10 (Июнь 10, 2013 22:44:26)
#6 Июнь 11, 2013 03:54:25
JOHN_16 От: Россия, Петропавловск-Камчатск Зарегистрирован: 2010-03-22 Сообщения: 3292 Репутация: 221 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
leonid_10
никто такой ерундой не занимается. Нормальные програмисты используют IDE потмоу что не хотят тратить времяна такие мелочи,а больше времени на написание грамотного кода и его сопровождении.
Особо прокаченные без проблем сидят на VIM, EMACS и тп потому что глубоко знают его функциональные особенности.
То как вы говорите про линукс, говорит о том тчо вы “с ним на Вы”, поэтому не надо на его тут наговаривать.
А то что вы тут про модули говорите…честно, — хотите заниматься ерундной, можете хотьб свою программу писать, которая бы понимала какие строки на сколкьо сдвигать, но опять же — хотите время тратить на ерунду — ваш выбор. Нас туда втягивать не надо.
Ни в коем разе не хотел задеть ничьи чувства и тп.
_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com
#7 Июнь 11, 2013 05:04:10
PooH От: Зарегистрирован: 2006-12-05 Сообщения: 1948 Репутация: 72 Профиль Отправить e-mail
Чем сдвинуть пробелы в коде?
Sublime Text поставьте или Komodo Edit, не IDE, но неплохие редакторы, и кривая обучения пологая в отличии от vim, или emacs. Строки двигать вполне позволяют. Просто качаете и ставите в домашний каталог.
Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…
Как сдвинуть все строки выделенного блока текста на один пробел вправо
Создавал функцию ,код получился длинным на 400 строк.Я забыл объявить её и теперь весь код без пробелов(отступов).Мне лень вручную расставлять пробелы .подскажите как можно перенести все строки на пробел пожалуйста.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Сдвинуть все элементы матрицы на один шаг вправо
В заданном к-м слое элементов целочисленного прямоугольного массива matrixnm сдвинуть все элементы.
Сдвинуть все элементы массива на один шаг вправо
Ребят, выручайте! Не дружу я с массивами, а нужно контрольную делать. Сдавать в пятницу уже.
Сдвинуть все элементы массива на один шаг вправо
В заданном k-м слое элементов целочисленного прямоугольного массива matrixnm сдвинуть все элементы.

В каждой строке матрицы Z(5,6) сдвинуть все элементы вправо на один разряд
Люди добрые, помогите. В каждой строке матрицы Z(5,6) сдвинуть все элементы вправо на один разряд.
Циклически сдвинуть все столбцы матрицы на один вправо, последний становится на место первого
1)В этом же массиве надо циклически сдвинуть все столбцы на один вправо, последний становится на.
Всё о методе shift() в pandas
Предположим, вы столкнулись с ситуацией, когда вам нужно сдвинуть все строки в датафрейме или вы хотите вычислить разницу в последовательных рядах. Метод Pandas shift() вам в помощь.
Затронем пару теоретических и пару практических моментов:
- cдвиг значений с помощью periods ;
- cдвиг данных временного ряда с помощью freq ;
- вычисление разницы в последовательных рядах ;
- вычисление разницы в 7 дней во временных рядах .
Сдвиг значений с помощью periods
Метод shift() сдвигает индексы в датафрейме на нужное количество значений. Простейший вызов этой функции должен содержать аргумент periods (по умолчанию periods=1 ), который представляет собой количество шагов сдвига для нужной оси. По умолчанию сдвигаются значения по вертикали вдоль оси 0 . Отсутствующие значения, появившихся в результате сдвига, будут автоматически заполнены NaN .
Давайте посмотрим, как это работает, на примере. Создадим датафрейм:
df = pd.DataFrame(< "A": [1, 2, 3, 4, 5], "B": [10, 20, 30, 40, 50] >)
Сдвинем индекс на 1 строку по вертикали:
df.shift(periods=1) # Так тоже можно: df.shift(1)
Для замены NaN можно использовать аргумент fill_value и проставить вместо пропусков 0 :
df.shift(periods=1, fill_value=0)
Кроме того, в periods можно передавать отрицательные числа, чтобы сдвигать значения в противоположном направлении.
Чтобы сдвинуть значения по горизонтали, можно задать axis=1 :
df.shift(periods=1, axis=1)
Сдвиг данных временного ряда с помощью freq
У метода shift() также есть аргумент freq . он позволяет выполнять сдвиг на основе некоей заданной частоты, что полезно при работе с данными временных рядов.
Чтобы использовать аргумент freq , необходимо убедиться, что индексами в вашем датафрейме являются типы date или datetime , иначе возникнет ошибка NotImplementedError .
Давайте посмотрим, как это работает, на примере:
df = pd.DataFrame(< "A": [1, 2, 3, 4, 5], "B": [10, 20, 30, 40, 50] >, index=pd.date_range("2020-01-01", freq="D", periods=5) )
Сдвинем индекс на 10 дней.
df.shift(freq='10D') # эквивиалент: df.shift(periods=10, freq="D")
При выполнении той же операции с помощью только одного аргумента periods вы получите следующий результат. Конечно, это не то, чего мы хотим.
Вычисление разницы в последовательных рядах
Предположим, вам нужно использовать значение предыдущего ряда для расчёта чего-либо. Тут тоже пригодится метод shift() :
df = pd.DataFrame(< "date": pd.date_range("2020-01-01", freq="D", periods=5), "sales": [22, 30, 32, 25, 42] >)
Рассчитаем изменение продаж в последовательных рядах.
df["diff"] = df["sales"] - df.shift(1)["sales"]
Короче, эта функция крайне полезна при работе с временными рядами. Давайте рассмотрим еще один практический пример.
Вычисление разницы для временного ряда
Теперь предположим, что вас попросили рассчитать изменение продаж за 7 дней следующим образом:
value_1 = Day_8 - Day_1 value_2 = Day_9 - Day_2 value_3 = Day_10 - Day_3 . value_n = Day_N - Day_N-7
Использование метода shift() с аргументом freq — идеальный способ решения этой задачи. Давайте воспользуемся методом read_csv() (пример данных здесь ) с аргументами parse_dates и index_col для формирования датафрейма.
df = pd.read_csv( "data/sales.csv", parse_dates=["date"], index_col=["date"], )
Обратите внимание, что запись для «2020-01-08» отсутствует. Выполнив df.shift(freq=’7D’) , вы должны получить результат с записью для «2020-01-08» .
Затем мы можем рассчитать изменение продаж за 7 дней:
the_7_days_diff = df["sales"] - df.shift(freq="7D")["sales"]
- в результате есть запись для «2020-01-08»;
- значение «2020-01-08» — NaN , потому что изначально в данных не было такого значения;
- значения для даты с «2020-01-01» по «2020-01-07» — NaN , потому что их нет и в df.shift(freq=’7D’) ;
- последние 6 записей — NaN , потому что в датафрейме не было этих значений.
Заключение
Метод shift() может быть очень полезен, когда нужно сдвинуть все строки в датафрейме или требуется использовать предыдущую строку для вычислений. А ещё он применяется при работе с данными временных рядов.
Рекомендуем также ознакомиться с документацией метода.
