Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2010 03:53:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10005
Репутация: +  857  -
Профиль   Отправить e-mail  

Буквы и/или числа в строке

>>> import re
>>> sa = 'abc32def2A3'
>>> sb = ''.join(c * int(n) for c, n in re.findall('([^\d]+)(\d+)', sa))
>>> sb
'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcdefdefAAA'
>>> sc = ''.join(m[0]*int(m[1:]) for m in re.findall('.\d+', sa))
>>> sc
'ccccccccccccccccccccccccccccccccffAAA'
>>> sc = eval(re.sub('(.)(\d+)', r'"\1"*\2+', sa)[:-1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
ab"c"*32+de"f"*2+"A"*3
^
SyntaxError: invalid syntax
>>>
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>>



Отредактировано (Окт. 7, 2010 03:55:06)

Офлайн

#2 Окт. 7, 2010 09:50:32

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Буквы и/или числа в строке

py.user.next
а для чего там r ?
Чтобы о нем не думать.



Офлайн

#3 Окт. 7, 2010 09:59:02

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Буквы и/или числа в строке

Забыли еще один вариант:

>>> import re
>>> sa = 'abc32def2A3'
>>> re.sub('.\d+', lambda x: x.group()[0]*int(x.group()[1:]), sa)
'abccccccccccccccccccccccccccccccccdeffAAA'
Ну а по поводу догматизма и демагогии можно почитать тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%B3%D0%BC%D0%B0
тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%B3%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%BC
и тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%B0%D0%B3%D0%BE%D0%B3%D0%B8%D1%8F



Отредактировано (Окт. 7, 2010 10:20:01)

Офлайн

#4 Окт. 7, 2010 11:30:37

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

Буквы и/или числа в строке

Ребята, это хорошо что вы пишите разные короткие версии, но мне бы для начала свою сделать чтобы работала, а потом уже упрощать ее.



Офлайн

#5 Окт. 7, 2010 12:42:28

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

Буквы и/или числа в строке

breidos
Вот добавил в одном месте = и ответ вывел
Это не ответ пока, к сожалению. Перечитайте мой пост и попробуйте сделать так, как я советовал. Если что непонятно - спрашивайте.

PS: Вот этот пост: http://www.python.su/forum/viewtopic.php?pid=57102#p57102 Может вы просто пропустили его как-нибудь?



Отредактировано (Окт. 7, 2010 12:44:28)

Офлайн

#6 Окт. 7, 2010 14:58:07

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

Буквы и/или числа в строке

Вот если так сделать:

x="Z15x33A2"
i=0
k=''
l=''
res=''
while i<len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
print res,
k=''
l=x[i]
i+=1
то ответ будет:
>>> 
ZZZZZZZZZZZZZZZ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>
Если поставить = в том месте где выше я писал то он
>>> 
ZZZZZZZZZZZZZZZ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AA
+ еще ошибку выдает - string index out of range



Офлайн

#7 Окт. 7, 2010 15:45:31

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

Буквы и/или числа в строке

С этим мы еще разберемся. Ответ у вас с пробелом, чего не должно быть, то есть программа еще не делает то, что нужно.
Позволю себе еще раз обратить внимание на мой пост, а именно на фразы “проверить есть ли у вас предыдущая буква(ее нужно запомнить в переменной, а не выводить) и число”, “добавить буква*число к результату” и “Результат вывести после цикла”.
Если вы внимательно посмотрите на ваш код, то ни проверки ни добавления к результату ни вывода после цикла там не обнаружите. Попробуйте все-таки сделать это все и покажите чего получилось. Да, вывод будет неполным, но мы это попробуем победить.

И еще: использование try/except без указания исключения, которое ловим - очень серьезная ошибка, так нельзя делать ни в коем случае. Попробуйте использовать isdigit, как тут советовали, либо указывайте исключение явно.



Офлайн

#8 Окт. 7, 2010 16:00:06

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

Буквы и/или числа в строке

Вот что у меня получилось: Ответ выводит без пробела, но неполный, ошибок не показывает. А

Ed
“проверить есть ли у вас предыдущая буква(ее нужно запомнить в переменной, а не выводить) и число”
я так и непонял как написать.
x="Z15x33A2"
i=0
k=''
l=''
res=''
otvet=""
while i<len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
k=''
l=x[i]
otvet+=res
i+=1
print otvet



Отредактировано (Окт. 7, 2010 16:00:51)

Офлайн

#9 Окт. 7, 2010 16:16:23

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

Буквы и/или числа в строке

Хорошо. Только otvet не нужен, постарайтесь обойтись res. И res=l*int(k) не нужно делать на каждую цифру, это совершенно лишнее. Достаточно сделать там, где появилась следующая буква. В этом случае у нас в k уже будет весь множитель.

И с try/except разберитесь.

Проверить есть ли у нас уже буква и число просто - нужно проверить не пусты ли у нас k и l. Если мы в них что-то прочитали уже, то они не будут пустыми. Эта проверка позволит отловить случаи, когда формат строки неверен, например строка начинается с числа.



Офлайн

#10 Окт. 18, 2010 20:18:11

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

Буквы и/или числа в строке

x="Z15x33A2"
i=0
k=''
l=''
res=''
while i<=len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
print res,
k=''
l=x[i]
i+=1
Блин, кто могет помогите, пишу так и неполучается доделать :(



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version