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

lanah_

Criar uma funcao so de letras

19 mensagens neste tópico

Como que crio uma funcao so de letras?

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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'))])

?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pra que complicar algo que é simples?

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
def letters(s):
    new_string = ""
    for char in s:
        if char in "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXZ":
            new_string += char
    return new_string

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
from string import letters

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

0

Partilhar esta mensagem


Link 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