Jump to content
thranduil

Transformar Upper case em Lower case

Recommended Posts

thranduil

Boas!

Estou a tentar fazer um exercício que, como o nome do tópico indica, pede para fazer uma função que pega numa string de vários caracteres, analisa se algum deles é uma letra maiúscula e se for transforma-a em minúscula. O exercício diz que não podemos usar a função lower, obviamente.

Eu escrevi o seguinte:

def minusculas(txt):
    "Transforms all txt (str) upper case letters in lower case"
    for i in range(0, len(txt), 1) :
        order = ord(txt[i])
        if ( order >= 65 ) and ( order <= 90 ):
            txt = txt[0:i] + chr(order+32)
    return txt

Quando corro na shell comandos como minusculas('aA'), tudo corre bem e o resultado é o esperado, 'aa'. No entanto, quando corro uma letra maíscula no início da string, por exemplo, 'Aa', obtenho o seguinte erro:

Traceback (most recent call last):

    File "<pyshell#65>", line 1, in <module>

        minusculas('Ab')

    File "C:/(...)/minusculas.py", line 23, in minusculas

    order = ord(txt)

IndexError: string index out of range

Alguém percebe o que se está a passar?

Além disso, se a string for, por exemplo 'aAA', obtenho o mesmo erro!

Agradecia a vossa ajuda ;)

Share this post


Link to post
Share on other sites
newbeen

Eu fiz umas pequenas modificações ao teu código e esta a funcionar perfeito assim


def minusculas(string="IsTo e So Para TesTar Em Casa De Nada Seja PaSSaDo"):
    
    txt=""
    for i in string:
order=ord(i)
if ( order >= 65 ) and ( order <= 90 ):
	txt+=chr(order+32)
	continue
txt+=chr(order)

    return txt


RHCE - 120-062-534

Share this post


Link to post
Share on other sites
Tharis

O que acontece é que tu estás a percorrer a string txt e a modificá-la ao mesmo tempo. Podes fazer isso, mas não te podes esquecer de adicionar o que o resto da string (da posição onde estás até ao fim).

def minusculas(txt):
    "Transforms all txt (str) upper case letters in lower case"
    for i in range(0, len(txt), 1) :
        order = ord(txt[i])
        if ( order >= 65 ) and ( order <= 90 ):
            txt = txt[0:i] + chr(order+32) + txt[i+1:]
    return txt

Outra maneira, mais fácil e melhor é criares uma nova variável.

def minusculas(txt):
    "Transforms all txt (str) upper case letters in lower case"
    newtxt = ""
    for i in range(len(txt)) :
        order = ord(txt[i])
        if ( order >= 65 ) and ( order <= 90 ):
            newtxt += chr(order+32)
        else:
            newtxt += txt[i]
    return newtxt

print minusculas("BLAHlal")

Podes também fazer one-liner! ;)

minusculas = lambda s: "".join(map(lambda c: chr(ord(c)+32) if (65 <= ord(c) and ord(c) <= 90) else c, s))
minusculas = lambda s: "".join( [ (chr(ord(c)+32) if (65 <= ord(c) and ord(c) <= 90) else c) for c in s] )

Share this post


Link to post
Share on other sites
newbeen

[OFF TOPIC]

Esses in liners são do pior que se pode fazer pela linguagem nem com óculos se consegue ler isso

[/OFF TOPIC]


RHCE - 120-062-534

Share this post


Link to post
Share on other sites
Tharis

@newbeen, ahah... Este por acaso até é simples. Tens o lambda principal que recebe a string, tens o map que substituir UPPER por lower e tens o reduce join que pega na lista retornada pelo map e converte-a a string. ;)

Share this post


Link to post
Share on other sites
thranduil

O que acontece é que tu estás a percorrer a string txt e a modificá-la ao mesmo tempo. Podes fazer isso, mas não te podes esquecer de adicionar o que o resto da string (da posição onde estás até ao fim).

xD Boa :D Percebo perfeitamente o erro e é dumb as hell xD

Inicialmente eu pensei em construir uma outra variável mas achei que não valia a pena e que podia fazer tudo na mesma :D Se calhar devia ter feito o que o prof. está sempre a dizer

"Primeiro façam com que o programa funcione. Preocupem-se em aperfeiçoar o código depois" :P

Muito obrigado a todos ;)

Share this post


Link to post
Share on other sites
hawk

Eu tambem estou com um problema nisso. podiam dar uma olhada no meu codigo? nao sei se eleesta bem construido, mas parece me logico, e funciona, por exemplo: se escrever minusculas ("OLA"), o resultado é OLa. Ou seja, se altera a ultima letra que passou de maiuscula para minuscula. Eu pretendia converte-las todas as letras maiusculas. Obrigado pela ajuda

import string

def minusculas (txt):
   a=txt
   for i in a:
       if ord(i)>=65 and ord(i)<=90:
           b= string.lower (i)
       c=string.replace (a,i,b)
   print c

Share this post


Link to post
Share on other sites
thranduil

hawk, se bem percebo, o que se está a passar é que sempre que chamas o string.replace, estás a pegar na string original e a substituir uma coisa. O programa num ciclo substitui o O de 'OLA'. No seguinte substitui o L por l mas como consideraste a string original outra vez, vai ficar 'OlA'. Quando passa para o A, substitui por a mas à string original, novamente. Ou seja, fica 'OLa'. Penso que é isto que se passa.

Ou seja, o que está acontecer é o seguinte:

a = 'OLA'

ciclo:

  - i = 'O' -> b = 'o' -> c = string.replace('OLA','O','o') = 'oLA'

  - i = 'L' -> b = 'l' -> c = string.replace('OLA','L','l') = 'OlA'

  - i = 'A' -> b = 'a' -> c = string.replace('OLA','A','a') = 'OLa'

Share this post


Link to post
Share on other sites

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.