Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: riderz44 en 9 Noviembre 2016, 09:34 am



Título: Leer archivo y separar por listas ordenadas.
Publicado por: riderz44 en 9 Noviembre 2016, 09:34 am
Hola soy nuevo en esto de python y me encontre con un ejercicio que intento resolver pero siempre me quedo cerca. Y debe ser de lo mas facil, si me ayudan puede que mi cabeza no explote  ;D

Consta en:
Leer un archivo txt que contiene palabras y sus significados, ejemplo:

basurita: Partícula de suciedad, especialmente la que se introduce en el ojo.
hacker: pirata informático.
perla: Frase llamativa por desafortunada.
etc

Luego agregar las palabras en una lista, y las definiciones en otra, pero ambas tienen que tener el mismo indice de orden, si listaPalabras[0] entonces listaDefiniciones[0].

Esto es hasta donde llego, trate de varias formas.


Código
  1. archivo=open("diccionario.txt","r")
  2. lineas=archivo.readlines()
  3. archivo.close()
  4. listaPalabras=[]
  5. listaDefinicones=[]
  6.  
  7. def listaPalabras(lineas):
  8.        for elemento in lineas:
  9.              if elemento[-1]==":":
  10.                    listaPalabras.append(elemento[0,-1])
  11.              else:
  12.                    listaPalabras.append(elemento)
  13.         return listaPalabras
  14.  





Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: tincopasan en 9 Noviembre 2016, 12:10 pm
seguramente no entendí bien el objetivo, a lo que interprete lo haría así:
Código
  1. archivo=open("diccionario.txt","r")
  2. lineas=archivo.readlines()
  3. archivo.close()
  4. listaPalabras=[]
  5. listaDefinicones=[]
  6.  
  7. def listarPalabras():
  8.    for elemento in lineas:
  9.        palabra=elemento.split(":")
  10.        listaPalabras.append(palabra[0])         #ambos elementos tendrán el mismo índice
  11.        listaDefinicones.append(palabra[1])
  12.  
  13.  
  14. listarPalabras()        
  15. print(listaPalabras[2])            #acá pruebo que tienen los índices de cada lista en este caso 2
  16. print(listaDefinicones[2])
  17.  
  18.  


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: riderz44 en 10 Noviembre 2016, 02:57 am
Si me funciono a la perfeccion, incluso aprendi sobre split, muchas gracias tincopasan. ;D


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: riderz44 en 15 Noviembre 2016, 19:01 pm
Perdon que vuelva a colocar el tema en cuestion, pero me han dicho que no puedo usar split en el problema, que tengo que reemplazarlo con while, a lo que viene mi pregunta, de que manera puedo hacerlo? intente de varias formas pero no me sale, se que la condicion es que cuando aparezca ":" agrege en una lista lo que viene antes de ":", y que en la otra lista lo que viene luego, pero no puedo hacer que funcione, help :'(


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: Once en 15 Noviembre 2016, 20:56 pm
Perdon que vuelva a colocar el tema en cuestion, pero me han dicho que no puedo usar split en el problema, que tengo que reemplazarlo con while, a lo que viene mi pregunta, de que manera puedo hacerlo? intente de varias formas pero no me sale, se que la condicion es que cuando aparezca ":" agrege en una lista lo que viene antes de ":", y que en la otra lista lo que viene luego, pero no puedo hacer que funcione, help :'(

Tienes varias formas:

1) Usar un buffer que guarde los caracteres hasta que llegues a un ":" o un salto de linea, y cuando llegues al ":" o el salto de línea  agregas el buffer a la lista y lo limpias
2) Usar slicing: buscas la posición en la cade donde esta el ":" (digamos n)y haces un slicing: cadena[:n] y cadena[n+1:]

PD: Si colocas el código que tienes, sería un poco más fácil orientarse según la idea que tengas

Saludos!


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: tincopasan en 16 Noviembre 2016, 04:04 am
me parece rídiculo lo que te piden, ya que el objetivo de python es simplificar no de complicar, pero bueno hay cada uno...
hice unas modificaciones al código anterior, solo agregue la función len() que supongo la podés usar! sino hay que seguir hueveando y agregando código. Usé while porque lo pediste sino tampoco es necesario!
espero sea más o menos lo que buscas:
Código
  1. #-*- coding: utf -8 -*-
  2. archivo=open("diccionario.txt","r")
  3. lineas=archivo.readlines()
  4. archivo.close()
  5. listaPalabras=[]
  6. listaDefinicones=[]
  7.  
  8. def encuentra(cadena, carac):
  9.    indice = 0
  10.    while indice < len(cadena):
  11.        if cadena[indice] == carac:
  12.            return indice
  13.        indice += 1
  14.    return -1
  15.  
  16. def listarPalabras():
  17.    for elemento in lineas:
  18.        divisor=encuentra(elemento,":")
  19.        listaPalabras.append(elemento[:divisor])        
  20.        listaDefinicones.append(elemento[divisor+1:])
  21.  
  22.  
  23. listarPalabras()        
  24. print(listaPalabras[1])            #acá pruebo que tienen los índices de cada lista en este caso 1
  25. print(listaDefinicones[1])
  26.  


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: riderz44 en 16 Noviembre 2016, 17:45 pm
Y la verdad que si, ya me habia puesto a estudiar split para poder presentar el porque esta en el codigo y como funciona, pero que me digan que vuelva con while me molesto, el codigo funciona genial gracias de nuevo tincopasan, lo habia hecho parecido pero tenia lineas de más que no servian, el tuyo es mas optimo.


Título: Re: Leer archivo y separar por listas ordenadas.
Publicado por: Once en 16 Noviembre 2016, 17:48 pm
me parece rídiculo lo que te piden, ya que el objetivo de python es simplificar no de complicar, pero bueno hay cada uno...

No es ridículo, es una muy buena práctica para adquirir un poco de lógica a la hora de programar, por eso en estos casos es mejor no dar los códigos hechos, sino guiar al usuario para que llegue a la solución por su propia cuenta.

Obviamente, luego de la etapa de aprendizaje, no es muy práctico (y a veces tampoco más eficiente) reinventar la rueda.

Saludos!