Ir para o conte√ļdo
  • Revista PROGRAMAR: J√° est√° dispon√≠vel a edi√ß√£o #60 da revista programar. Faz j√° o download aqui!

lanah_

Criar uma funcao so de letras

Mensagens Recomendadas

lanah_

Como que crio uma funcao so de letras?

N sei usar o loop direito, tem alguem q possa me explicar um pouquinho?¬† ¬† ūüė≥

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
lanah_

eh, que retorne uma string que tenha so letras em uma string

Por ex. :

so_letras("56Ytdjo986.0")

no caso retornaria so "Ytdjo" como resultado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Algo tipo isto:

def f(x):
     return ''.join([y for y in x if ord(x) in range(int('a'), int('z')) or ord(x) in range(int('A'), int('Z'))])

?


N√£o pe√ßas ajuda por PM! A tua d√ļvida vai ter menos aten√ß√£o do que se for postada na sec√ß√£o correcta do f√≥rum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Eu estava a falar do resultado, mas eu explico-te o que faz.

Pega em todos os caracteres, vê quais estão entre a-z ou A-Z e mete-os na lista pela ordem que apareceram. Depois pega-se nessa lista e junta-se tudo numa string sem qualquer separação entre os elementos da lista.

Basicamente:

listaum = range(int('a'), int('z'))
listadois = range(int('A'), int('Z'))
x = []

for letra in frase:
    if ord(letra) in listaum or ord(letra) in listadois:
        x.append(letra)

print ''.join(x)


N√£o pe√ßas ajuda por PM! A tua d√ļvida vai ter menos aten√ß√£o do que se for postada na sec√ß√£o correcta do f√≥rum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tharis

listaum = range(int('a'), int('z'))
listadois = range(int('A'), int('Z'))
x = []

for letra in frase:
    if ord(letra) in listaum or ord(letra) in listadois:
        x.append(letra)

print ''.join(x)

Estão aí coisas mal:

  • A fun√ß√£o int() recebe uma string e converte-a para inteiro, se e s√≥ se, os caracteres forem d√≠gitos de um n√ļmero, tal como tu sabes... Acho que a fun√ß√£o que querias era a ord() que meteste l√° em baixo
  • Ao fazeres range(ord('a'),ord('z')) est√°s a fazer uma lista de n√ļmeros do intervalo [ord('a'),ord('z')[, ou seja, sem o ord('z'), logo os 'z' e 'Z' n√£o v√£o funcionar. :)

listaum = range(ord('a'), ord('z')+1)
listadois = range(ord('A'), ord('Z')+1)
x = []

for letra in frase:
    if ord(letra) in listaum or ord(letra) in listadois:
        x.append(letra)

print ''.join(x)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

Pra que complicar algo que é simples?

def so_letras(s):
   return filter(lambda c: c.isalpha(), s)


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tharis

Pra que complicar algo que é simples?

def so_letras(s):
  return filter(lambda c: c.isalpha(), s)

Betovsky, não é complicar, aliás, é o contrário.

Uma pessoa que pede ajuda numa coisa destas (que é simples para nós), não deve conhecer minimamente a funcionalidade de Python.

Eu acho que o que o tirácio fez está muito bem porque é a maneira mais simples em termos de percepção de código para um newbie.

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

AH?!?!

Um linha do tamanho de um cami√£o TIR composta por fun√ß√Ķes de ordem superior e listas por compreens√£o √© a maneira mais simples de percep√ß√£o de c√≥digo para um noob???


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tharis

AH?!?!

Um linha do tamanho de um cami√£o TIR composta por fun√ß√Ķes de ordem superior e listas por compreens√£o √© a maneira mais simples de percep√ß√£o de c√≥digo para um noob???

Não é um camião TIR, é um for a percorrer a string e a ver se ela pertence ao abecedário... Sim, usar a isalpha() era bem. :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Estão aí coisas mal:

  • A fun√ß√£o int() recebe uma string e converte-a para inteiro, se e s√≥ se, os caracteres forem d√≠gitos de um n√ļmero, tal como tu sabes... Acho que a fun√ß√£o que querias era a ord() que meteste l√° em baixo
  • Ao fazeres range(ord('a'),ord('z')) est√°s a fazer uma lista de n√ļmeros do intervalo [ord('a'),ord('z')[, ou seja, sem o ord('z'), logo os 'z' e 'Z' n√£o v√£o funcionar. :)

listaum = range(ord('a'), ord('z')+1)
listadois = range(ord('A'), ord('Z')+1)
x = []

for letra in frase:
    if ord(letra) in listaum or ord(letra) in listadois:
        x.append(letra)

print ''.join(x)

Tens raz√£o sim senhora. :D

O Betovsky tem razão é relação ao ser mais simples com um filter, mas requer conhecimentos que quem faz um tópico destes não tem. :P


N√£o pe√ßas ajuda por PM! A tua d√ļvida vai ter menos aten√ß√£o do que se for postada na sec√ß√£o correcta do f√≥rum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Betovsky

E tem do join ? √Č que acho o filter mais simples de usar, mais intuitivo do que o join e principalmente mais f√°cil de explicar..

Não é um camião TIR, é um for a percorrer a string e a ver se ela pertence ao abecedário... Sim, usar a isalpha() era bem. :D

Referia-me ao primeiro...

J√° agora, usaram o range com o ord para verem as letras. O range s√≥ aceita n√ļmeros, certo. Mas n√£o existe nada gen√©rico? Tipo range para qualquer tipo de dados que seja enumer√°vel?

Tharis se não existe, Python é muito fraquinho.... :P


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

E tem do join ? √Č que acho o filter mais simples de usar, mais intuitivo do que o join e principalmente mais f√°cil de explicar..

Depende do ponto de vista. Pessoalmente acho o join mais intuitivo do que o filter.

J√° agora, usaram o range com o ord para verem as letras. O range s√≥ aceita n√ļmeros, certo. Mas n√£o existe nada gen√©rico? Tipo range para qualquer tipo de dados que seja enumer√°vel?

√Č capaz de existir, n√£o sou nenhuma b√≠blia ambulante :D

N√£o pe√ßas ajuda por PM! A tua d√ļvida vai ter menos aten√ß√£o do que se for postada na sec√ß√£o correcta do f√≥rum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
lanah_

Consegui isso:

def letters(s):
    new_string = ""
    for char in s:
        if char.lower() in "abcdefghijklmnopqrstuvwxz":
            new_string += char
        elif char.upper() in "ABCDEFGHIJKLMNOPQRSTUVWXZ":
            new_string += char
    return new_string

Se eu quisesse diminuir a funcao, qual seria uma maneira de faze-lo?

Obrigada pelas respostas  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fnds
def letters(s):
    new_string = ""
    for char in s:
        if char in "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXZ":
            new_string += char
    return new_string

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tharis
from string import letters

def function(s):
    new_string=""
    for char in s:
        if char in letters:
            new_string+=char
    return new_string

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. √Č f√°cil!

Registar nova conta

Entra

J√° tem conta? Inicie sess√£o aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site voc√™ aceita os nossos Termos de Uso e Pol√≠tica de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informa√ß√Ķes visite esta p√°gina.