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

Поиск:

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


Шустрый
*


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

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



Народ! На ровном месте застопорилась! Помогите, плиз!

Делается ввод:

весной
природа
просыпается


Вывод:

в  п  п
е  р  р
с  и  о
н  р  с
о  о  ы
й  д  п
    а  а
        е
        т
        с
        я


Это здание следует делать так. Функция get_lines (она выглядит так):

Код

def get_lines(stroka):
    lst = []
    while True:
        s = raw_input(stroka)
        if not s: 
            break
        lst.append(s)
    return (lst)


Функция get_max_len она определяет длинну самой длинной строки в списке. 

Функция fixed_len_list получает в качестве параметров: lst - список строк разной длинны n - целое число В качестве результата функция выдает другой список, полученный из исходного так, что все строки стали длинны n длинные строки обрезаны, к коротким же в конец добавлены пробелы.

Функция turn_list получает список строк, а выдает новый список, в котором первая строка составлена из первых символов строк исходного списка. Вторая строка из вторых символов. Пример: ["abc", "123"] превращается в ["а1", "b2", "с3"]

Функция print_list будет выглядеть так: 

Код

def print_list(spisok):
     for s in spisok:
          print s


Функция main с помощью указанных выше ф-ций вводит список строк определяет длинну самой длинной строки введенный список превращает в список строк постоянной длинны с помощью turn_list поворачивает строки вертикально печатает строки.

Пожалуйста, скажите, как написать ф-ции get_max_len, fixed_len_list и turn_list Как написать main я уже по ходу соображу. Заранее большое спасибо!

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


λcat.lolcat
****


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

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



Код
def get_max_len(lst):
    return max(map(len, lst))

def fixed_len_list(lst, n):
    return [s[:n].ljust(n) for s in lst]

def turn_list(lst):
    # предполагая, что все строки имеют одинаковую длину
    return [''.join(s[i] for s in lst) for i in range(len(lst[0]))]

Если есть проблемы с пониманием или запрет на использование higher order functions и list comprehensions, то всё это можно переписать так:
Код
def get_max_len(lst):
    result = 0
    for s in lst:
        if len(s) > result
            result = len(s)
    return result

def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        elif len(s) > n:
            result.append(s[:n])
    return result

def turn_list(lst):
    result = []
    for i in range(len(lst[0])):
        item = ''
        for s in lst:
            item += s[i]
        result.append(item)
    return result



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


Шустрый
*


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

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



Народ!
Помогите, плиз!
Я тут с преподом пообщалась и он мне дал дельный совет - проверить по отдельности работу каждой функции, что я и сделала:
Код

def get_max_len(lst):
    result = 0
    for s in lst:
        if len(s) > result:
            result = len(s)
    return result
a = get_max_len(["avendessorra", "boy", "nice","to"])
print a


Код

def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        elif len(s) > n:
            result.append(s[:n])
    return result
a = fixed_len_list(["holly", "grace", "joy", "toy"], 5)
print a


Код

def turn_list(lst):
    result = []
    item = ''
    i=0
    for s in lst:
        item += s[i]
    i = i+1
    result.append(item)
    return result
a = turn_list(["holly", "grace", "joy", "toy"])
print a


И функция print_list, так как она должна печатать строки по буквам - одну под другой, то будет выглядеть так:
Код

def print_list(result):
    for s in result:
        for k in s:
            print k
    return result
a = print_list(["123", "456", "789", "101"])


Я эти функции привожу для наглядности, чтоб понятно было, как и что.
Я попробовала функцию main записать так:
Код

def main():
    stroka = ">>>"
    a = get_lines(stroka)
    b = get_max_len(a)
    c = fixed_len_list(b, 7)
    d = turn_list(c)
    print_list(d)
main()    


В общем виде вся программа выглядит так:

Код

def get_lines(stroka):
    lst = []
    while True:
        s = raw_input(stroka)
        if not s: 
            break
        lst.append(s)
    return (lst)

def get_max_len(lst):
    result = 0
    for s in lst:
        if len(s) > result:
            result = len(s)
    return result

def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        elif len(s) > n:
            result.append(s[:n])
    return result

def turn_list(lst):
    result = []
    item = ''
    i=0
    for s in lst:
        item += s[i]
    i = i+1
    result.append(item)
    return result

def print_list(result):
    for s in result:
        for k in s:
            print k
    return result

def main():
    stroka = ">>>"
    a = get_lines(stroka)
    b = get_max_len(a)
    c = fixed_len_list(b, 7)
    d = turn_list(c)
    print_list(d)
main()    


Но у меня она не работает так, как надо. Вылезает ошибка указывающая на строку
Код

c = fixed_len_list(b, 7)

Как поправить main? В чем ошибка?
PM MAIL Skype Jabber MSN   Вверх
Void
Дата 15.3.2007, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Ошибок много.

Одна из них моя: неправильно написал второй вариант функции fixed_len_list. Надо так:
Код
def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        else:
            result.append(s[:n])
    return result

Чуете разницу? А всего-то хотел сэкономить на лишнем копировании, когда len(s) == n. Преждевременная оптимизация — зло.
Код
a = get_lines(stroka)
b = get_max_len(a)
c = fixed_len_list(b, 7)
d = turn_list(c)

Тут налицо полное непонимание того, что делает код. Построчно: в переменную a занесли введённый список строк, в b — максимальную длину. Функция fixed_len_list ожидает первым параметром список строк, а вторым — требуемую длину строки в результирующем списке. А что получает? Максимальную длину и какое-то магическое число. А надо:
Код
lines = get_lines(stroka)
fixed = fixed_len_list(lines, get_max_len(lines)
result = turn_list(fixed)

Непонятно с какой целью изменена функция turn_list. Похоже на неудачную попытку избавиться от цикла for ... range. Что в нём такого криминального? Функция работала как надо.

И наконец, print_list выведет совсем не то, что ожидалось. Надо переписать её так:
Код
def print_list(result):
    for s in result:
        print s


Итоговый код:
Код
def get_lines(stroka):
    lst = []
    while True:
        s = raw_input(stroka)
        if not s: 
            break
        lst.append(s)
    return (lst)

def get_max_len(lst):
    result = 0
    for s in lst:
        if len(s) > result:
            result = len(s)
    return result

def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        else:
            result.append(s[:n])
    return result

def turn_list(lst):
    result = []
    for i in range(len(lst[0])):
        item = ''
        for s in lst:
            item += s[i]
        result.append(item)
    return result

def print_list(result):
    for s in result:
        print s

def main():
    stroka = ">>>"
    a = get_lines(stroka)
    c = fixed_len_list(a, get_max_len(a))
    d = turn_list(c)
    print_list(d)

if __name__ == '__main__':
    main()

Стоит обратить внимание на последнюю строчку. Этот «магический» if будет запускать main только в том случае, если скрипт запускается как самостоятельная программа. Многие (и люди, и фреймворки автоматического тестирования) имеют привычку импортировать его как модуль и тестировать, как посоветовал преподаватель, по функциям. И запуск main тут ни к чему.


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


Шустрый
*


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

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



Большое спасибо за помощь)))
PM MAIL Skype Jabber MSN   Вверх
Paranorma
Дата 16.3.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть еще один вопросик. smile 
Мне препод предложил эту задачку импортировать по разным модулям следующим образом:
Ф-ции:
Код

def get_lines(stroka):
    lst = []
    while True:
        s = raw_input(stroka)
        if not s: 
            break
        lst.append(s)
    return (lst)


и
Код


def print_list(result):
    for s in result:
        print s

Поместить в модуль first.
В модуль second поместить ф-ции
Код

def get_max_len(lst):
    result = 0
    for s in lst:
        if len(s) > result:
            result = len(s)
    return result
def fixed_len_list(lst, n):
    result = []
    for s in lst:
        if len(s) < n:
            result.append(s.ljust(n))
        else:
            result.append(s[:n])
    return result

def turn_list(lst):
    result = []
    for i in range(len(lst[0])):
        item = ''
        for s in lst:
            item += s[i]
        result.append(item)
    return result

И в модуль third поместить только это:
Код

def main():
    stroka = ">>>"
    a = get_lines(stroka)
    c = fixed_len_list(a, get_max_len(a))
    d = turn_list(c)
    print_list(d)
main()

Надо один файл импортировать в другой... Читала учебник, но не поняла, как мне быть...
Я написала в файле first "import  second"
В файле second написала import third
Но и это видимо не верно, а главное что написать в в файле third?
PLEASE HELP!!! SOS!!!
PM MAIL Skype Jabber MSN   Вверх
Void
Дата 16.3.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



В модули first и second (бр-р, ну и названия) раскладываем функции, как сказано, ничего не добавляем.
В модуле third пишем:
Код
import first
import second

# и обращаемся к функциям через имя модуля, в котором они определены
def main():
    stroka = ">>>"
    a = first.get_lines(stroka)
    c = second.fixed_len_list(a, second.get_max_len(a))
    d = second.turn_list(c)
    first.print_list(d)

main()

Учебник почитать ещё раз.


--------------------
“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.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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