Jump to content

Recommended Posts

Posted (edited)

boas

tenho a seguinte cadeia

c = 'ab[4c]'

e quero transforma-la de maneira a ficar com abcccc

ou seja, multiplicar de alguma forma o 4 em c

como faço?

Edited by msmsms
Posted (edited)

Boas, quando olhei a primeira vez parecia-me que tinhas uma lista um bocado estranha, mas depois vi que afinal tens uma string..

Não deve ser bem isto que queres, mas aqui fica:

cria 3 listas vazias

faz um for loop por cada carácter na string,

dentro desse for loop faz um if (ex: if not in 'abcd..'), e faz um append à primeira lista,

depois utilizas o ultimo valor da lista para multiplicares e adicionares a segunda lista para ficares ficares com cccc,

finalmente concatenas as duas primeiras na terceira..

Confuso? (confeso que eu também me perdi um bocadinho, quando comecei a escrever só tinha uma lista 🙂 ...)

Boa Sorte!

edit: quando comecei a escrever o thoga31 ainda não tinha dito nada, e o meu raciocínio parecia-ME ter lógica... lol

Edited by Gnrtuga

Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Posted
Citação
faz um for loop por cada carácter na string,

Gnrtuga espero que n leves a mal mas: nem pensar! 🙂 aliás, é importante colocar essa hipotese na mesa mas, posteriormente, decidir que não é uma boa ideia por se complicar muito facilmente. (Embora, seja a solução mais obvia para uma primeira analise)

Na minha opinião, o melhor para resolver este tipo de problemas é o modulo re [1] (no entanto, tenho pouca experiência com este modulo).

Em primeiro lugar, no interior dos parenteses rectos está uma linguagem propria. Mesmo que seja só:

"[" (inteiro a definir o numero de repetições) (string para repetir) "]"
eu não reconheço este tipo de gerador de strings.

Com isto em mente, eu diria para procurares com este padrão:


>>> exemplo1 = "ab[4c]de[5f]gh"
>>> exemplo2 = "As pe[2s]oas co[2r]em para o Ar[2e]iro"
>>> import re
>>> p = re.compile(r"\[\w*\]")
>>> for m in p.finditer(exemplo1): print m.group()[1:-1], m.span()
...
4c (2, 6)
5f (8, 12)
>>> for m in p.finditer(exemplo2): print m.group()[1:-1], m.span()
...
2s (5, 9)
2r (15, 19)
2e (31, 35)
Agora tens que hackar (não sei qual é a palavra portuguesa para este verbo... artimanhar?) os ciclos for de forma a extraires o número. Algo do género:

>>> exemplo3 = "O número de série é o [5F12g7]6B"
>>> p2 = re.compile(r"[-+]?\d+")
>>> for m in p1.finditer(exemplo3):
...	 generator = m.group()[1:-1]
...	 g = p2.match(generator)
...	 print m.group(), "->", int(g.group()), "vezes", generator[g.end():], "=", int(g.group())*generator[g.end():]
...
[5F12g7] -> 5 vezes F12g7 = F12g7F12g7F12g7F12g7F12g7
e substituires a string gerada na string original.

Tenho a sensação que existe um metodo dos objectos p1 e p2 para fazer a substituição directamente, mas n sei como se usa...

[1] http://docs.python.org/2/howto/regex.html#regex-howto

Posted

ffunenga , claro que não levo a mal (se receberes alguma multa para pagar não fui eu.. 🙂 ) , como disse a MIM parecia-me ter lógica..lol

Nunca tinha ouvido falar deste modulo... e muito sinceramente nem estou a perceber a utilidade.. mas acredito que deve ter.. 🙂

Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Posted

O módulo re é poderosíssimo. Mas acho que o @msmsms ainda não está exactamente numa fase de o poder utilizar.

Além disso, acho que este exercício é excelente para treinar, de uma forma geral, a criação de mini-parsers e que pode ser facilmente transcrito noutras linguagens.

Resolvi o problema proposto não com um for mas sim com um while. Claro que não é universal e considera que qualquer string que tenha [] é uma string com "código". Seria necessário fazer um pequeno controlo para saber quando é que os [] eram código ou não.

Como digo, é um exercício muitíssimo interessante para nos obrigar a raciocinar.

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.