Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Python] Сдвиги влево и вправо 
V
    Опции темы
Paranorma
Дата 20.1.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Люди!
Я снова к вам обращаюсь за помощью! Простите меня, бестолковую!

Задание заключается вот в чем:

имеется список:

Код

a = [45, 34, 12, 10, 15]


количество элементов в списке увеличиваться и уменьшаться не должно. Но в нем должен происходить сдвиг влево, т.е. второй элемент становиться первым, последний - предпоследним, затем следовать 0. СТРОГО НАСТРОГО ЗАПРЕЩЕНО ИСПОЛЬЗОВАТЬ МЕТОДЫ DEL И APPEND. То есть я поняла, что происходить переприсваивание. Элементу с индексом 0 присвоить значение элемента с индексом 1, элементу с индексом 1 присвоить значение элемента с индексом 2 и т.д.

то есть в калькуляторе это будет выглядеть так:

Код

[34, 12, 10, 15, 0]
[12, 10, 15, 0, 0]
[10, 15, 0, 0, 0] 


Эта задача снова на использование цикла while, причем один в другом.
Я как-то недавно писала о задаче с удалением дубликатов:

Код

 a = [45, 1, 34, 12, 45, 45, 12, 1, 34, 10, 15, 15]
i = 0
while i < len(a)-1:
    j = i+1
    while j < len(a):
        if a[i] == a[j]: 
            del a[j]
        else:
            j = j + 1
    i = i + 1
print a


Насколько я понимаю, она очень похожа на эту, но тут мне не совсем понятно, как в новом задании поступать с переменными i и j. 
PM MAIL Skype Jabber MSN   Вверх
Void
Дата 20.1.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



В чём проблема?
Код
a = [1, 2, 3, 4, 5, 6]
i = 0
while i < len(a) - 1:
    a[i] = a[i + 1]
    i += 1
a[i] = 0

Или даже так smile
Код
a = a[1:] + [0]


Это сообщение отредактировал(а) Void - 20.1.2007, 22:22


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Paranorma
Дата 21.1.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Проблема в том, что при всем чтении учебников я едва понимаю, как все это работает.

А как быть, если сдвиг нужен в обратную сторону?
 Т.е. вместо [1, 2, 3, 4, 5, 6] получить [0, 1, 2, 3, 4, 5]  
PM MAIL Skype Jabber MSN   Вверх
Void
Дата 21.1.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Код
a = [1, 2, 3, 4, 5, 6]
i = len(a) - 1
while i > 0:
    a[i] = a[i - 1]
    i -= 1
a[i] = 0


А можно поинтересоваться, какими именно учебниками пользуетесь?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Paranorma
Дата 21.1.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Void, спасибо, что помогаете мне. Наверно, я вас совсем замучила. smile 
Я пользуюсь Tutorial в самой программе, "Язык программирования Python",
авторы Россум, Дрейк, Откидач (тот же Tutorial, только по русски), "Учимся программировать вместе с Питоном", автор Чаплыгин А.Н.

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

Препод велел еще сделать циклические сдвиги, когда в первом случае список [1, 2, 3, 4, 5, 6] превращается в [6, 1, 2, 3, 4, 5], а в другом превращается [2, 3, 4, 5, 6, 1] 

Увы, даже такие элементарные вещи не получаются. smile    
PM MAIL Skype Jabber MSN   Вверх
Void
Дата 22.1.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Циклический сдвиг:
Код
# влево
a[-1] = a[0] # эквивалентно a[len(a) - 1] = a[0]
i = 0
while i < len(a) - 1:
    a[i] = a[i + 1]
    i += 1

# вправо
a[0] = a[-1]
i = len(a) - 1
while i > 0:
    a[i] = a[i - 1]
    i -= 1

Цитата(Paranorma @  21.1.2007,  20:53 Найти цитируемый пост)
Россум, Дрейк, Откидач (тот же Tutorial, только по русски), "Учимся программировать вместе с Питоном"

Посмотрел, неплохое руководство. Могу только пожелать удачи.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Paranorma
Дата 23.1.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Да, по Чаплыгину книга вообще хорошая.


А как превратить a = [1, 2, 3, 4, 5, 6] в a = [6, 5, 4, 3, 2, 1]???

Могу конечно и так написать, но мне то через while надо:

Код

a=[1, 2, 3, 4, 5, 6]
a[-1] = 1
a[-2] = 2
a[-3] = 3
a[-4] = 4
a[-5] = 5
a[-6] = 6
print a

PM MAIL Skype Jabber MSN   Вверх
doomik
Дата 23.1.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Одинокий волк
**


Профиль
Группа: Участник
Сообщений: 360
Регистрация: 25.10.2005
Где: #vingrad

Репутация: 3
Всего: 15



Какое условие задачи ? 
Я вижу 2
  •  Отсортировать элементы по убыванию
  •  Перевернуть массив
Догадываюсь что надо второй вариант написать:

Программа копирует элементы их массива a[] в a2[] в обратном порядке, дальше освобождаем массив 
a[] от его старых элементов а потом присваиваем ему элементы массива a2[]

Код

a = [1, 2, 3, 4, 5, 6]
a2 = [] # Создаем дополнительный массив
I = len(a)-1 # Запоминаем длинну a[] массива в I
aLen = len(a) # Запоминаем длинну a[] массива в aLen

while I > -1: # Читаем каждый элемент в масиве a[] и присваиваем его в массив a2[]
    a2.append(a[I])
    I -= 1

I = 0

while I != len(a): # Удаляем все элементы в массиве a[] чтоб потом заполнить его новыми элементами
    del(a[I])
    
I = 0 

while I != aLen: # Копируем элементы массива a2[] в массив a[]
    a.append(a2[I])
    I += 1

print a 



Это сообщение отредактировал(а) doomik - 23.1.2007, 15:45


--------------------
"Единственный способ изучать новый язык программирования - писать на нем 
программы." 
- Brian Kernighan

Remember, st1ng3r 
/server irc.ircline.ru /j #vingrad
PM   Вверх
Void
Дата 23.1.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Просто меняем местами симметричные элементы.
Код
def reverse(a):
    while i < len(a) / 2:
        t = a[i]
        a[i] = a[-i - 1]
        a[-i - 1] = t
        i += 1



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Paranorma
Дата 23.1.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Код

a = [1, 2, 3, 4, 5, 6]
i = 0
while i < len(a) / 2:
    t = a[i]
    a[i] = a[-i - 1]
    a[-i - 1] = t
    i = i + 1
print a

Ну вот такая она у меня вышла... Вроде, работает!
PM MAIL Skype Jabber MSN   Вверх
pythonwin
Дата 24.1.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: нет
Всего: 36



Void, ++1 за помощь Paranorma с питоном
PM WWW GTalk Jabber   Вверх
albertn
Дата 24.1.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 1
Всего: 34



А не проще ли использовать код типа:
Код

s = [1,2,3,4,5,6]
print s[1:]+[s[0]]
print [s[-1]]+s[:-1]

PM WWW ICQ   Вверх
Void
Дата 24.1.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



albertn, разумеется. Но дело в том, что
Цитата(Paranorma @  20.1.2007,  21:57 Найти цитируемый пост)
Эта задача снова на использование цикла while

и так далее в таком духе.
Я не считаю этот способ преподавания правильным, но c'est la vie.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
V.A.KeRneL
Дата 24.1.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 7
Всего: 14



Цитата(Void @  24.1.2007, 17:43 Найти цитируемый пост)

Я не считаю этот способ преподавания правильным, но c'est la vie.

Ну почему же? На ранних стадиях обучения программированию, которые, очевидно, осваивает Paranorma, главное — научиться придумыват и реализовывать своими руками элементарные алгоритмы, пользуясь примитивами, а не [сколь бы то ни было] продвинутыми методами и фишками языка.

Вот моё «безопасное» (не портящее массив-аргумент, а создающее новый) решение для задачи реверса массива (списка): 
Код

def reverse(a):
    b = []
    i = len(a) - 1
    while (i >= 0):
        b.append(a[i])
        i -= 1
    return b


Ниже приведено понравившееся мне решение задачи левого и правого сдвигов массива (списка) slav0nic'а с форума http://python.com.ua/forum/.

>>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>>
Код

def left_move(a, n):
    """
    a - список
    n - на сколько сдвигать
    """
 
    while n:
        a = a[1:] + [a[0]]
        n -= 1
    return a
 
 
def right_move(a, n):
    while n:
        a = [a[-1]] + a[:-1]
        n -= 1
    return a
 
 
a = [1, 2, 3, 4, 5, 6]
print a
print "<< 2", left_move(a, 2)
print ">> 2", right_move(a, 3)


Код

> /usr/bin/python -u "/tmp/1.py"
[1, 2, 3, 4, 5, 6]
<< 2 [3, 4, 5, 6, 1, 2]
>> 2 [4, 5, 6, 1, 2, 3]


имхо так покрасивше В)
сдвигается по 1 элементу за цикл

slav0nic = {jid: "[email protected]",
                 home: "http://slav0nic.xss.ru",
                 LJ: "http://slav0nic.livejournal.com"}
<<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<<

Я бы переписал его так (для «безопасности»): 
Код

def simple_dup(a): 
    b = []
    for x in a: 
        b.append(x)
    return b


def left_move(a, n): 
    """
    a - список
    n - на сколько сдвигать
    """
    
    b = simple_dup(a)
    
    while n: 
        b = b[1:] + [b[0]]
        n -= 1
    
    return b


def right_move(a, n): 
    """
    a - список
    n - на сколько сдвигать
    """
    
    b = simple_dup(a)
    
    while n: 
        b = [b[-1]] + b[:-1]
        n -= 1
    
    return b


a = [1, 2, 3, 4, 5, 6]
print a
print "<< 2", left_move(a, 2)
print ">> 2", right_move(a, 3)



Это сообщение отредактировал(а) V.A.KeRneL - 24.1.2007, 18:48


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Void
Дата 24.1.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



V.A.KeRneL, в таком случае надо брать либо другой язык, либо другие задачи. Впрочем, самые ранние стадии обучения программированию для меня всегда были загадкой smile

Произвольный сдвиг можно и попроще записать.
Код
def shift(a, n):
    return a[n:] + a[:n]

n положительно — влево, отрицательно — вправо. Впрочем, чтобы не запоминать, я пошёл бы небольшое дублирование и оставил shift_left, shift_right с идентичным кодом.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1832 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.