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

ZNez

Dicionarios

23 mensagens neste tópico

Boas... estou aqui a resolver um exercicio em python, em que tenho que criar um dicionario em que a chave seja uma palavra e o valor o numero de vezes que ela aparece. Escrevi o seguinte codigo:

def Pergunta8(path):
dic={}
ficheiro=open(path,"r")
texto=ficheiro.read()
print texto
ficheiro.close()
for palavra in texto.replace("\n"," ").split(" "):
	print palavra
	dic[palavra]=texto.count(palavra)
return dic

O problema e que para este texto (exemplo, dado):

bolo bola toto bolo tete e teste e aquele e o outro toto

pato pata pato

O código devolve como input:

{'bola': 1, 'e': 9, 'toto': 2, 'bolo': 2, 'pata': 1, 'teste': 1, 'o': 14, 'outro': 1, 'aquele': 1, 'tete': 1, 'pato': 2}

Ou seja... conta os "e"s e "o"s de todas as palavras... tenho tentado corrigir o erro... mas ate agora aindan nao consegui descobrir numa maneira...

Qualquer ajuda...

Obrigado.

:hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta assim:

def Pergunta8(path):
dic={}
ficheiro=open(path,"r")
texto=ficheiro.readline()
print texto
ficheiro.close()
for palavra in texto.replace("\n"," ").split(" "):
	print palavra
	dic[palavra]=texto.count(palavra)
return dic

Só uma wild guess porque não sei bem a diferença do read / readline.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
def Pergunta8(path):
    dic = {}
    for palavra in open(path, "r").read().split():
        if palavra != '': dic[palavra] += 1
    return dic

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

texto=ficheiro.readline()

Só uma wild guess porque não sei bem a diferença do read / readline.

Se substituir o read por readlines apenas a primeira linha do ficheiro era lida... nao ia contar portanto todas as palavras.

def Pergunta8(path):
    dic = {}
    for palavra in open(path, "r").read().split():
        if palavra != '': dic[palavra] += 1
    return dic

Wow... isso e que reduzir codigo... contudo está a dar-me erro na adicao de valores... supostamente para dicionarios tambem deveria funcionar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, ups, desculpa, pensei que fosse numa só linha :)

Mete aqui o output do código. O problema no código do thyrax é que não inicias o dicionario com dic[palavra]=0. Logo, ele não tem onde incrementar ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já o tinha escrito em cima... so que enganei-me e estava input..

Bem, o codigo da-me o seguinte output:

{'bola': 1, 'e': 9, 'toto': 2, 'bolo': 2, 'pata': 1, 'teste': 1, 'o': 14, 'outro': 1, 'aquele': 1, 'tete': 1, 'pato': 2}

O problema esta nos casos como "e" e "o", que ele conta em todas as palavras e nao apenas quando esta isolado.

Aqui esta o texto:

bolo bola toto bolo tete e teste e aquele e o outro toto ["\n" - muda de linha]

pato pata pato

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

def Pergunta8(path):
    dic = {}
    for palavra in open(path, "r").read().split():
        if palavra != '':
            try:
                dic[palavra] += 1
            except KeyError:
                dic[palavra] = 1
    return dic

Já deve de dar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

rolando2424, KeyError é para que tipo de erros?

Para quando tentas aceder a uma chave num dicionário e ela não existe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e necessario colocar-mos a seguir a "except" o tipo de erro? pelo que tenho testado (em outros progs) nao faz diferenca...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e necessario colocar-mos a seguir a "except" o tipo de erro? pelo que tenho testado (em outros progs) nao faz diferenca...

O tipo de erro serve apenas para apanhar aquele tipo de erro.

Se tiveres só except, ele apanha-te todos os erros e manda-os para o mesmo bloco de código.

Podes mesmo ter vários excepts para um só bloco try.

Por exemplo:

try:
    ...
    ...
    ...
except KeyError:
    ...
except ValueError:
    ...
except IOError:
    ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto de um gajo estar habituado ao PHP é lixado (não ter de inicializar variáveis ;)). :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto de um gajo estar habituado ao PHP é lixado (não ter de inicializar variáveis ;)). :)

Não tinha reparado nisso quando estive a trabalhar com ele :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ainda uma duvida... a excepcao e colocada porque o codigo e executado da direita para a esquerda, ou seja... ele comeca por somar 1 a algo que ainda nao existe, so quando a chave = palavra e q existe e e feita a associacao, como ja disseram em cima nao foi atribuido nenhum valor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A excepção é colocada porque ele primeiro tenta aceder à variável dic[palavra] e observa que não existe.

Daí o erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pensei q fosse ao contrario, primeiro ao valor... mas espera, ao associar a "palavra" como chave do dicionario esta passa a existir... por exemplo esse erro nao se passava com o meu condigo inicial...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pensei q fosse ao contrario, primeiro ao valor... mas espera, ao associar a "palavra" como chave do dicionario esta passa a existir... por exemplo esse erro nao se passava com o meu condigo inicial...

New code brings new bugs.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele "cria" uma entrada no dicionário tipo CHAVE: VALOR_NULO , uma vez que não lhe dás qualquer valor. Daí, quando tentas incrementar, ele dá erro porque Nulo não é nada .. (acho eu)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele "cria" uma entrada no dicionário tipo CHAVE: VALOR_NULO , uma vez que não lhe dás qualquer valor. Daí, quando tentas incrementar, ele dá erro porque Nulo não é nada .. (acho eu)

Nada a ver com isso. A questão é que vais incrementar algo que não existe (porque ainda não declarei aquela chave), daí dar erro. Basta declarar e incrementar (acontece na primeira ocorrência sempre, no except) para não voltar a falhar.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lá está..estás a tentar incrementar um valor "nulo".. algo que não existe.. daí o "cria" ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lá está..estás a tentar incrementar um valor "nulo".. algo que não existe.. daí o "cria" ;)

Não. O erro não é esse. Se fosse como tu estavas a dizer, ele queixava-se de estares a somar 2 tipos diferentes (None e Integer). O problema é que a variável não existe, que é diferente de existir e ter valor None.
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