Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2010 09:48:52

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Всем привет!

Прошу помощи в задаче (хочу понять алгоритм):

пользователь вводит строку (длинную, без знаков препинания, пробелов) - одни лат.буквы, которая может занимать пару строк. Необходимо каждые 3 буквы заменить одной по определенным правилам (приведу 3 правила: amn -> k, jjj -> l, fjd -> p). Всю строку можно разбить на такие тройки (лишних нет). Причем тройка может начинаться на одной строке, а заканчиваться на другой (для меня этот момент самый сложный).
Вот я хотел бы разобраться, каким образом это можно провернуть …

Спасибо



Офлайн

#2 Сен. 24, 2010 10:58:46

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Выделение подстроки

Читайте доки по работе со строками и смотрите метод replace.
http://www.intuit.ru/department/pl/python/6/3.html
P.S. Есть же куча книг на русском языке, почему бы там не посмотреть сперва?



Офлайн

#3 Сен. 24, 2010 11:26:09

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Я бы правила в словарь занес, что-то типа {'amn' : k, ‘jjj’ : l, ‘fjd’ : p} и т.д..
А после уже проводить замену =)



Офлайн

#4 Сен. 24, 2010 11:51:54

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Вот похожая задача http://www.python.su/forum/viewtopic.php?id=8525
С переносом на новую строку можно бороться так:

mystring.replace('\n','')



Офлайн

#5 Сен. 24, 2010 20:59:27

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Что-то вы то добавляте, то удаляете коммент, AmF.
Я бы так разделил текст по 3 символа:

text="ndkvfjbikvbjsh\nfbvfvjnewirvk"
txt=text.replace('\n', '')
n=len(txt)
i=n/3
key=0
while key < i:
nlist=txt[0:3]
print nlist
txt=txt.replace(nlist, '')
key+=1



Офлайн

#6 Сен. 24, 2010 21:11:22

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

За инфу - спасибо! У меня процесс идет - напишу одно - возникнет новая мысль - проверю - напишу другое …

Вот что у меня пока получилось: сначала объединил всё в одну большую строку, а потом разбил всё на тройки …

mystr = 'nnnvvvbhjuytfds\nhjkkjhfdsuiofdsyuitremnb\ngfuyitttrew'
mystr.replace('\n','')
s1 = mystr.split()
print s1
seq = ''
str = seq.join(s1)

while i < len(str):
posl = str[i:i + 3]
print posl
i += 3
Помогите, пжлст, с последней частью: надо теперь каждую тройку заменить на результат выполнения ф-ции zvuk() - ф-ция, которая заменяет тройку символов на 1 символ … - она у меня написана … мне непонятно, как это использовать …

Спасибо …



Отредактировано (Сен. 24, 2010 21:25:49)

Офлайн

#7 Сен. 25, 2010 04:13:54

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Я Вас иногда не понимаю.. Вы бы код привели своей функции zvuk()…

dic={'ndk':'k', 'vfj':'a', 'bik':'f', 'vbj':'r', 'shf':'u',
'bvf':'p', 'vjn':'c', 'ewi':'e', 'rvk':'g'}
text="ndkvfjbikvbjsh\nfbvfvjnewirvk"
txt=text.replace('\n', '')
n=len(txt)
i=n/3
key=0
roll=[]
while key < i:
nlist=txt[0:3]
txt=txt.replace(nlist, '')
key+=1
roll.append(dic.get(nlist))
seq = ''
str_ = seq.join(roll)
print str_



Офлайн

#8 Сен. 25, 2010 09:13:55

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Выделение подстроки

А просто пройтись по словарю и поменять не проще будет?
Как-нибудь так:

dic = {'ndk':'k', 'vfj':'a', 'bik':'f', 'vbj':'r', 'shf':'u',
'bvf':'p', 'vjn':'c', 'ewi':'e', 'rvk':'g'}
text = "ndkvfjbikvbjsh\nfbvfvjnewirvk".replace('\n', '')
for key in dic:
text = text.replace(key, dic[key])
print text
Ну или тоже самое с извоащениями:
print reduce(lambda x, y: x.replace(y, dic[y]), dic, "ndkvfjbikvbjsh\nfbvfvjnewirvk".replace('\n', ''))



Офлайн

#9 Сен. 25, 2010 09:23:04

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

grok
Ага, спасибо! Только вот не могу понять, почему это не работает для, например, такого ввода:

 text = "ndkndkndkvfjbikvbjsh\nfbvfvjnrvkrvkrvkewirvk"
Т.е. когда во вводимом тексте есть повторяющиеся символьные последовательности, идущие одна за другой - программа выводит замену только для первой тройки символов из повтора - остальные игнорирует и переходит потом к другой тройке, отличной от этой.

Спасибо



Отредактировано (Сен. 25, 2010 09:23:55)

Офлайн

#10 Сен. 25, 2010 09:31:48

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Выделение подстроки

Ed Спасибо! Ваш код работает для любых последовательностей!

И последний вопрос: у меня есть ф-ция zvuk() - она принимает тройку символов и возвращает 1 символ и ф-ция main() - в которой в длинной строке выделяются тройки и заменяются последовательно на 1 символ. Можно ли в ф-ции main() вызвать ф-цию zvuk() ? - т.е., когда надо заменить тройку, вызываем zvuk() - она заменяет - и смотрим на след. тройку и т.д. ?

Вот ф-ция zvuk():

dic = {'ndk':'k', 'vfj':'a', 'bik':'f', 'vbj':'r', 'shf':'u',
'bvf':'p', 'vjn':'c', 'ewi':'e', 'rvk':'g'}
sl = raw_input("Enter the codon: ")
return ' '.join([dic.get(cod, ' ') for cod in sl.split(', ')])
Спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version