Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
lanah_

Criar uma funcao so de letras

Recommended Posts

lanah_

Como que crio uma funcao so de letras?

N sei usar o loop direito, tem alguem q possa me explicar um pouquinho?    😳

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other sites
fnds
def letters(s):
    new_string = ""
    for char in s:
        if char in "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXZ":
            new_string += char
    return new_string

Share this post


Link to post
Share on other 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

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
Sign in to follow this  

×

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.