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

BlodyGrl

Obter palavras de uma string

16 mensagens neste tópico

O exercício consiste em dar um input de um nome de uma pessoa e obter o 1º e 2º nomes... Gostaria de saber onde está o erro. Agradecida!  ;)

def nome():
    a=""
    b=""
    k=1
    x=raw_input()
    for i in range(len(x)):
        while x[i] != " ":
            a=a+x[i]
            k=k+1
        for j in range(len(x)):
            if j>=k & x[j]!=" ":
                b=b+x[j]
    return a + " " + b

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

while x[i] != " ":
            a=a+x[i]
            k=k+1

Se x[ i] for diferente de " " vai continuar a ser... não alteras o vector x nem o índice i... dentro do while

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes sempre implementar uma condição elif que te diga que quando o x[ i] == " ", a palavra já armazenada é guardada numa variavel. Tipo:

a = ""
x = raw_input()

for i in range(len(x)):
    if x[i] != " ":
        a = a+x[i]
    elif x[i] == " ":
        primeiroNome = a
        a = ""
ultimoNome = a

Quanto ao teu erro, tens que tirar o while. O ciclo for já te vai percorrer a string x só por si ;) Assim como tens ,tens um ciclo infinito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uau! Nunca pensei que fosse tão simples!  :wallbash: É a minha mania de complicar tudo!  :)

Agora vou ver se consigo fazer o programa porque não era bem o que vos pedi.  :P Obrigado pela a ajuda!

Só uma pergunta... Porque é que usaste elif e não usaste else? Porque ou é espaço ou não é... Também se pode usar o else,certo?

Raios isso dá-me o único nome que não quero. xD Aquele que é antes do último. Porque o exercício pede o 1º,2º e último... :P:) :)

Já consegui obter o último mas os 2 primeiros agora deixaram de me aparecer.  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O 1o e segundo nome assim depressa?

print ' '.join(raw_input("Qual é o teu nome?").split(" ")[0:2])

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tirácio, parece-me a mim, assim, de repente, que quem quer fazer isto assim, é porque está a começar a aprender, e ir para esse tipo de funções em nada vai ajudar :P Se bem que é a maneira mais prática ;)

Quanto à tua dúvida BlodyGirl, pensava que era apenas o 1o e o 2o. Se queres vários, podes sempre fazer assim: tiras partido das listas de python. Assim, modificas o teu código para que, a cada espaço que encontrar (x[ i] == " "), em vez de ser primeiroNome = a, fica algo como aTuaLista.append(a), mas com isto tens que iniciar a lista antes, perto do raw_input (aTuaLista = []). Desta forma, cada espaço que encontra, o código dirige para a lista o nome que já tem e volta a por a variável A em branco. No fim, basta fazeres print à lista. Esta maneira dá para vários, indefinidamente.

a = ""
x = raw_input()
aTuaLista = []

for i in range(len(x)):
    if x[i] != " ":
        a = a+x[i]
    elif x[i] == " ":
        aTuaLista.append(a)
        a = ""

print aTuaLista

Outra alternativa:

a = ""
x = raw_input()
primeiroNome = False

for i in range(len(x)):
    if x[i] != " ":
        a = a+x[i]
    else:
        if not primeiroNome: # Se o primeiro nome já estiver definido, não toma o valor inicial de False. Se não estiver, é porque ainda não foi mudado o valor de False, e esta condição é verdadeira.
            primeiroNome = a
            a = ""
        else:
            nomeDoMeio = a
            a = ""
ultimoNome = a

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tirácio, parece-me a mim, assim, de repente, que quem quer fazer isto assim, é porque está a começar a aprender, e ir para esse tipo de funções em nada vai ajudar :P Se bem que é a maneira mais prática ;)

Só tinha lido por alto o tópico, e mesmo para começar, acho que está a fazê-lo mal. Para andar a fazer splits à mão, ela está a fazê-los em Haskell. É muito mais simples, e prático, usar o split do Python:

nome = raw_input("Qual é o teu nome? ")

nomes = nome.split() #quando não é passado argumento, ele vai fazer split nos espaços, \n, \r e \t

print nomes[0], nomes[1], nomes[-1] #1o, 2o e ultimo nome

Mas usando um for pelo input:

nome = raw_input("Qual é o teu nome? ")
nomes = [""]
i = 0
for x in nome:
    if x != ' ':
        nomes[i] += x
    else:
        nomes.append("")
        i += 1

print nomes[0], nomes[1], nomes[-1]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Raios, as coisas são tão fáceis e eu não as consigo fazer. Só me apetece bater com a cabeça contra a parede!  :wallbash:

É que eu já aprendi isso tudo mas não sei porquê o meu cérebro não chega lá sozinho...  :P

Obrigado pelas respostas. Realmente usar splits era a melhor coisa a fazer, sem usar tantos for's e linhas de comando que só iriam confundir as coisas. Além disso o primeiro programa do João só dava os primeiros 3 nomes... Ou seja só dava o que eu queria se a pessoa só tivesse 3 nomes.  :P

Agradecida a todos! ;)

Só uma pergunta:para que serve o \r? :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sempre pensei que estivesses a usar este tipo de aproximação à linguagem porque não sabias/podias usar outro. Daí ter-te recomendado aquela estratégia.

O \r não sei o que faz...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o \r é o char correspondente ao Carriage Return.

Já agora o \n é o Line feed.

Dependendo do SO uma mudança de linha pode ser um das combinações desses chars. Por exemplo Linux é \n, no Windows é \r\n.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dependendo do SO uma mudança de linha pode ser um das combinações desses chars. Por exemplo Linux é \n, no Windows é \r\n.

E em Mac salvo erro usa-se \r.

Já agora, ao conjunto espaço, \t, \r e \n chama-se whitespace.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu o \t (tab) e o \n (linha nova) sabia o que eram, o \r é que não :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E em Mac salvo erro usa-se \r.

Agora já não, usam o \n, como os UNIX. Penso que isso só aconteceu antes do Mac OS X.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu sabia que o Mac tinha usado \r, mas tenho visto sempre \n... :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, eu sei que \n é para mudança de linha e \t para tabulações ams realmente não conhecia o \r... Talvez porque apesar de ter o Linuz instalado no meu computador nunca me preocupei em usá-lo... :D

E sim João tens razão... Eu ainda sou novata mas fatias é das primeiras coisas que se aprende... :P

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