Foros del Web » Programando para Internet » Python »

Duda planteamiento del programa

Estas en el tema de Duda planteamiento del programa en el foro de Python en Foros del Web. Buenas, Tengo una duda a la hora de enfocar como llevar a cabo el programa. Dispones de un fichero1 de entrada txt con 100.000 lineas ...
  #1 (permalink)  
Antiguo 21/05/2009, 00:25
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Duda planteamiento del programa

Buenas,

Tengo una duda a la hora de enfocar como llevar a cabo el programa.

Dispones de un fichero1 de entrada txt con 100.000 lineas o más.
Estas lineas contienen 6 números separados por un espacio
Los números de una misma linea nunca se repiten y están ordenador de menor a mayor.


Quiero hacer dos cosas:

1) Quiero a partir de otro fichero2 con X lineas del mismo estilo que el fichero1 saber si alguna de estas coincide con alguna del fichero1


2) Saber si en el fichero1 contiene alguna linea repetida

Mi pregunta es como lo plantearíais para hacerlo de una forma eficiente recorriendo el fichero las menos veces posibles

Muchas gracias de antemano!!
  #2 (permalink)  
Antiguo 21/05/2009, 09:51
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda planteamiento del programa

Se me ocurre una forma en la que el código sería sencillo.
Utilizar "for x in" para recorrer el archivo, ir guardando cada línea en una lista, utilizar "for x in" en esa lista para ver si la línea que lees pertenece ya a la lista y por lo tanto es repetida.

El segundo caso es similar, podrías leer uno de los archivos hacia una lista (de líneas) y luego recorrer el otro, preguntando en cada línea si pertenece a la lista o no.

El problema es que, aunque se trate de código muy sencillo y solamente leas cada archivo una vez, en el "peor caso" (aquel en el que no hay líneas repetidas) estarías recorriendo la lista de líneas (sumatoria de 1 hasta 100000) veces, o lo que es lo mismo n(n+1)/2 veces, con n=100000.

Este número es nada más ni nada menos que 5000050000 :


Saludos.
  #3 (permalink)  
Antiguo 21/05/2009, 13:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda planteamiento del programa

Cita:
Iniciado por alvlin Ver Mensaje
Se me ocurre una forma en la que el código sería sencillo.
Utilizar "for x in" para recorrer el archivo, ir guardando cada línea en una lista, utilizar "for x in" en esa lista para ver si la línea que lees pertenece ya a la lista y por lo tanto es repetida.

El segundo caso es similar, podrías leer uno de los archivos hacia una lista (de líneas) y luego recorrer el otro, preguntando en cada línea si pertenece a la lista o no.

El problema es que, aunque se trate de código muy sencillo y solamente leas cada archivo una vez, en el "peor caso" (aquel en el que no hay líneas repetidas) estarías recorriendo la lista de líneas (sumatoria de 1 hasta 100000) veces, o lo que es lo mismo n(n+1)/2 veces, con n=100000.

Este número es nada más ni nada menos que 5000050000 :


Saludos.
Gracias Alvin.

Creo que con el primer caso te referias a mi segundo caso y viceversa.

Tengo el segundo caso, cuando una linea esta repetida en la lista, sería esto


Código python:
Ver original
  1. import sys
  2.          
  3. entrada=sys.argv[1]
  4. file = open(entrada,'r')
  5. combinaciones=[]
  6.  
  7. for linea in file:
  8.     if linea in combinaciones:
  9.         print "repetida: " + linea,
  10.     else:
  11.         combinaciones.append(linea)

Esta es como bien dices una manera.

Sobre el primer caso... podría tener en una lista todas las combinaciones 100.000 o más y en otra lista las que quiero buscar, pero para cada combinación que quiero comparar con el fichero debe recorselo entero.

En python no existe metodos de ordenación para buscar más rapido? tipo burbuja (el que mas me suena por el nombre) etc... ?
  #4 (permalink)  
Antiguo 21/05/2009, 15:27
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda planteamiento del programa

Cita:
Iniciado por neodani Ver Mensaje
Creo que con el primer caso te referias a mi segundo caso y viceversa.
Perdón por eso

Cita:
Iniciado por neodani Ver Mensaje
Sobre el primer caso... podría tener en una lista todas las combinaciones 100.000 o más y en otra lista las que quiero buscar, pero para cada combinación que quiero comparar con el fichero debe recorselo entero.
No tiene por qué recorrerlo entero si primero guardas su contenido en una lista o tupla. Sería más rápido.

Cita:
Iniciado por neodani Ver Mensaje
En python no existe metodos de ordenación para buscar más rapido? tipo burbuja (el que mas me suena por el nombre) etc... ?
Existe la operación sort() para listas (lista.sort()), que cambia la lista original (no devuelve una lista modificada)
Por aquí se describen algunas otras formas más complejas, aunque en inglés

http://xahlee.org/perl-python/sort_list.html
http://wiki.python.org/moin/HowTo/Sorting



Saludos.
  #5 (permalink)  
Antiguo 22/05/2009, 00:06
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda planteamiento del programa

Cita:
Iniciado por alvlin Ver Mensaje
Perdón por eso


No tiene por qué recorrerlo entero si primero guardas su contenido en una lista o tupla. Sería más rápido.



Existe la operación sort() para listas (lista.sort()), que cambia la lista original (no devuelve una lista modificada)
Por aquí se describen algunas otras formas más complejas, aunque en inglés

http://xahlee.org/perl-python/sort_list.html
http://wiki.python.org/moin/HowTo/Sorting



Saludos.
He estado mirando ambas páginas pero no he visto una ordenación de varias listas a la vez. Me explico, esto funciona

>>> li=[1,9,2,3];
>>> li.sort();
>>> print li;
[1, 2, 3, 9]

El problema es que yo quiero ordenar las listas, no los elementos de ellas, porque ya estan ordenados.

>>> li=[13,15,20,22],[1,2,3,9],[1,3,5,6];
>>> li.sort();
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'sort'
  #6 (permalink)  
Antiguo 22/05/2009, 09:41
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda planteamiento del programa

Cita:
Iniciado por neodani Ver Mensaje
El problema es que yo quiero ordenar las listas, no los elementos de ellas, porque ya estan ordenados.

Código:
>>> li=[13,15,20,22],[1,2,3,9],[1,3,5,6];
>>> li.sort();
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'sort'
Ese código falla por otro motivo
Al asignar li de esa forma lo que haces es crear una tupla de listas. sort() modifica la lista original, pero las tuplas son inmutables => no existe el método sort para tuplas.

Tu código funcionaría si hicieras

li=[ [13,15,20,22],[1,2,3,9],[1,3,5,6] ]

(un comentario: el punto y coma al final de la línea no es requerido)


Saludos.
  #7 (permalink)  
Antiguo 22/05/2009, 11:21
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Duda planteamiento del programa

Cita:
Iniciado por alvlin Ver Mensaje
Ese código falla por otro motivo
Al asignar li de esa forma lo que haces es crear una tupla de listas. sort() modifica la lista original, pero las tuplas son inmutables => no existe el método sort para tuplas.

Tu código funcionaría si hicieras

li=[ [13,15,20,22],[1,2,3,9],[1,3,5,6] ]

(un comentario: el punto y coma al final de la línea no es requerido)


Saludos.
Excelente :D

Muchisimas gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.