Estoy tratando de entender si tiene sentido tomar el contenido de una lista y agregarlo a otra lista.
Tengo la primera lista creada a través de una función de bucle, que obtendrá líneas específicas de un archivo y las guardará en una lista.
Luego, se utiliza una segunda lista para guardar estas líneas e iniciar un nuevo ciclo sobre otro archivo.
Mi idea era obtener la lista una vez que se realiza el ciclo for, volcarla en la segunda lista, luego comenzar un nuevo ciclo, volcar el contenido de la primera lista nuevamente en la segunda pero agregarla, por lo que la segunda lista será la suma de todos los archivos de lista más pequeños creados en mi bucle. La lista debe agregarse solo si se cumplen ciertas condiciones.
Se parece a algo similar a esto:
# This is done for each log in my directory, i have a loop running
for logs in mydir:
for line in mylog:
#...if the conditions are met
list1.append(line)
for item in list1:
if "string" in item: #if somewhere in the list1 i have a match for a string
list2.append(list1) # append every line in list1 to list2
del list1 [:] # delete the content of the list1
break
else:
del list1 [:] # delete the list content and start all over
¿Tiene sentido o debo ir por una ruta diferente?
Necesito algo eficiente que no tome muchos ciclos, ya que la lista de registros es larga y cada archivo de texto es bastante grande; Así que pensé que las listas se adaptarían al propósito.
Eche un vistazo a itertools.chain para ver una forma rápida de tratar muchas listas pequeñas como una sola lista grande (o al menos como una única lista grande iterable) sin copiar las listas más pequeñas:
fuente
Eso parece bastante razonable para lo que estás tratando de hacer.
Una versión un poco más corta que se apoya en Python para hacer más trabajo pesado podría ser:
El
(True for line in list1 if "string" in line)
iteralist
y emiteTrue
cada vez que se encuentra una coincidencia.any()
utiliza la evaluación de cortocircuito para regresarTrue
tan pronto como se encuentre el primerTrue
elemento.list2.extend()
añade el contenido delist1
al final.fuente
any(True for line in list1 if "string" in line)
está más claramente escrito comoany("string" in line for line in list1)
.any
recibe un generador; no se construye ninguna lista de valores verdaderos o falsos en ningún lado. Mi versión devuelve más cosas paraany
verificar, pero a cambio de no hacer la misma verificación en el generador. Me imagino que es un lavado, perotimeit
aquí tiene autoridad, no yo. :)También puede combinar dos listas (digamos a, b) usando el operador '+'. Por ejemplo,
fuente
Para recapitular sobre las respuestas anteriores. Si tiene una lista con
[0,1,2]
y otra con[3,4,5]
y desea fusionarlas, entonces se convierte en[0,1,2,3,4,5]
, puede usarchaining
oextending
debe conocer las diferencias para usarlo sabiamente para sus necesidades.Extendiendo una lista
Usando el método de
list
clasesextend
, puede hacer una copia de los elementos de una lista a otra. Sin embargo, esto causará un uso de memoria adicional, que debería estar bien en la mayoría de los casos, pero podría causar problemas si desea ser eficiente en la memoria.Encadenando una lista
Al contrario, puede usar
itertools.chain
para conectar muchas listas, lo que devolverá un llamadoiterator
que se puede usar para iterar sobre las listas. Esto es más eficiente en cuanto a memoria, ya que no está copiando elementos sino simplemente apuntando a la siguiente lista.fuente
Utilizando el
map()
yreduce()
funciones incorporadasMínimo "para bucle" y elegante patrón de codificación :)
fuente
Si tenemos una lista como la siguiente:
dos formas de copiarlo en otra lista.
1)
2)
fuente