Jump to content

Recommended Posts

Posted (edited)

Boa Tarde

Eu tenho o seguinte exercicio tenho que ler o conteudo de um ficheiro colocar no dicionario como chave a palavra e como valor o numero da linha em que ela se encontra por exemplo:

conteudo do ficheiro:

lisboa é
bonita

d={'lisboa':[1], 'é':[1], 'bonita':[2]} 

como é que eu posso fazer isto primeiro pensei que o melhor método era usar o readlines para ler o ficheiro assim ele divide cada linha numa lista mas depois não consigo tirar só uma palavra da lista.

Desde já obrigado

Edited by pwseo
code tags.
Posted (edited)
def fileToDict(filename):
D={}
inFile=open(filename, "r")
data=inFile.readline()

print data

se usar a função Split tenho de fazer só read em vez de deadline, eu não posso fazer data.splt(" ")para ele separar pelos espaços?

Edited by thoga31
GeSHi
Posted (edited)

gonca16,

Já em tópicos anteriores tens tido dúvidas semelhantes. Repara no seguinte pseudo-código:

d ← {}
f ← ficheiro
para cada linha em f:
   para cada palavra na linha:
       d[linha].adicionar(numero(linha))

É mais ou menos isso que precisas. De facto, o código Python que faz o que pretendes é quase igual a esse pseudo-código.

Uma dica adicional: para obter os números das linhas, podes utilizar a função enumerate:

with open('texto.txt') as f:
   for n, l in enumerate(f, 1):
       # n: número da linha
       # l: a linha
       print('{}: "{}"'.format(n, l.strip()))

$ python exemplo.py
1: "lisboa é"
2: "bonita"

Adenda:

Perdi-me a responder a uma pergunta que não tinhas colocado, mas achei pertinente, pois parece-me que estás a orientar as tuas resoluções de forma um pouco errada: se os problemas que te colocam são resolvidos linha-a-linha, a tua solução ficará também mais simples e legível se for estruturada da mesma forma.

A função split pode ser invocada sem argumentos para separar nos espaços:

>>> 'Um texto  de      exemplo'.split()
['Um', 'texto', 'de', 'exemplo']

PS.: não sei se já perguntei isto... mas por que motivo estás a utilizar Python 2 e não Python 3?

Edited by pwseo
acrescentada adenda.
  • 2 weeks later...
Posted (edited)

d={'lisboa':[1], 'é':[1], 'bonita':[2]} 

Para organizar desta forma ^. Aproveita o código do colega gonca16, acima, e faz isso:

dicio = dict()
with open('d.txt') as f:
  for n, l in enumerate(f, 1):
  wd = l.split()
  for w in wd:
	 dicio.update({w:n})
	 print('{}: "{}"'.format(n, w))   ### <<< optinal

f.close()
print dicio

Agora note que no formato que citei:

d={'lisboa':[1], 'é':[1], 'bonita':[2]} 

, a chave é a palavra e o valor é o número da linha. Cuidado com este formato, pois se houver palavra repetidas no decorrer do ficheiro, o dicionário atualizará, porém, indicando o número de palavra e, não, a linha que ela ocupa.

Para exemplificar: suponha o seguinte ficheiro.

Lisboa é

bonita

A menina é

bonita

A menina

mora em Lisboa

Acho que o problema não se resolve com Dict... Ou seja, se for pra armazenar em um dicionário, acho que não vai dar certo para qualquer ficheiro...

Edited by Richard597
Posted

Richard597,

Aproveita o código do colega gonca16, acima, e faz isso:

O código não era do gonca16 mas sim meu. O gonca16 é que veio pedir ajuda nesta thread, e eu estava a tentar explicar-lhe o que fazer.

Continuando...

dicio = dict()
with open('d.txt') as f:
  for n, l in enumerate(f, 1):
     wd = l.split()
     for w in wd:
        dicio.update({w:n})
        print('{}: "{}"'.format(n, w))   ### <<< optinal

f.close()
print dicio

Quando utilizas with statements para abrir um ficheiro não precisas de o fechar, uma vez que esse é um dos motivos para utilizar o with. Por outras palavras, aquele f.close() é desnecessário.

Relativamente ao problema das repetições de palavras ao longo do ficheiro, o facto de cada entrada do dicionário ser uma lista resolve isso, pois no caso de uma palavra que ocorra múltiplas vezes, o output seria algo como:

{'palavra': [1, 2, 2, 5], 'outra': [3], ...}

No excerto de código que apresentaste de facto o problema verifica-se, mas há formas de o solucionar para o output ser semelhante ao que indiquei (utilizando a função append, que no pseudo-código designei por «adicionar»).

Por fim: o meu objectivo em «andar às voltas» sem dar a solução completa foi dar ao gonca16 todas as ferramentas necessárias para encontrar a solução por ele, sem lha dar de bandeja, incentivando assim a aprendizagem. É necessário ter isso em atenção 🙂

Posted

O código não era do gonca16 mas sim meu...

Primeiramente, desculpe-me pela troca dos nomes.

No excerto de código que apresentaste de facto o problema verifica-se, mas há formas de o solucionar para o output ser semelhante ao que indiquei (utilizando a função append, que no pseudo-código designei por «adicionar»).

Foi uma solucao como esta que encontrei aqui: Usar um "if" para testar se a palavra já existe no dict, caso "True" fazer o "append(n)" e retornar à interação.

Sim! antes que me esqueça! com relação ao "f.close()", é força do habito! frequentemente uso função open()! Obrigado por ter feito a correção.

Por fim: o meu objectivo em «andar às voltas» sem dar a solução completa foi dar ao gonca16 todas as ferramentas necessárias para encontrar a solução por ele, sem lha dar de bandeja, incentivando assim a aprendizagem. É necessário ter isso em atenção 🙂

Eu entendo essa tua postura... E tem que ser assim mesmo. Vou tentar me ater com relação a isso... 👍

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
×
×
  • Create New...

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.