gonca16 Posted January 6, 2016 at 05:54 PM Report #591501 Posted January 6, 2016 at 05:54 PM (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 January 6, 2016 at 09:18 PM by pwseo code tags.
pwseo Posted January 6, 2016 at 09:17 PM Report #591512 Posted January 6, 2016 at 09:17 PM Já experimentaste utilizar a função split()? Que código escreveste até agora?
gonca16 Posted January 7, 2016 at 11:36 AM Author Report #591545 Posted January 7, 2016 at 11:36 AM (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 January 7, 2016 at 01:05 PM by thoga31 GeSHi
pwseo Posted January 8, 2016 at 04:23 PM Report #591659 Posted January 8, 2016 at 04:23 PM (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 January 8, 2016 at 09:49 PM by pwseo acrescentada adenda.
Richard597 Posted January 19, 2016 at 07:57 AM Report #592158 Posted January 19, 2016 at 07:57 AM (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 January 19, 2016 at 08:52 AM by Richard597
pwseo Posted January 19, 2016 at 01:37 PM Report #592168 Posted January 19, 2016 at 01:37 PM 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 🙂
Richard597 Posted January 19, 2016 at 10:32 PM Report #592187 Posted January 19, 2016 at 10:32 PM 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... 👍
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now