Tome el contenido de una lista y agréguelo a otra lista [duplicado]
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 finalice 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 agregándolo, 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 adjuntarse únicamente si se cumplen determinadas condiciones.
Parece 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 esto sentido o debería tomar una ruta diferente?
Necesito algo eficiente que no requiera demasiados ciclos, ya que la lista de registros es larga y cada archivo de texto es bastante grande; entonces pensé que las listas se ajustarían al propósito.
probablemente quieras
list2.extend(list1)
en lugar de
list2.append(list1)
Aquí está la diferencia:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = [7, 8, 9]
>>> b.append(a)
>>> b
[4, 5, 6, [1, 2, 3]]
>>> c.extend(a)
>>> c
[7, 8, 9, 1, 2, 3]
Dado que list.extend()
acepta un iterable arbitrario, también puedes reemplazar
for line in mylog:
list1.append(line)
por
list1.extend(mylog)
Para recapitular las respuestas anteriores. Si tiene una lista con [0,1,2]
y otra con [3,4,5]
y desea fusionarlas, [0,1,2,3,4,5]
puede usar chaining
o extending
y debe conocer las diferencias para usarlo sabiamente según sus necesidades.
Ampliar una lista
Usando el método list
de clases extend
, puedes hacer una copia de los elementos de una lista a otra. Sin embargo, esto provocará un uso adicional de memoria, lo que debería estar bien en la mayoría de los casos, pero podría causar problemas si desea optimizar la memoria.
a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]
Encadenando una lista
Por el contrario, puede utilizar itertools.chain
para conectar muchas listas, lo que devolverá un llamado iterator
que se puede utilizar para iterar sobre las listas. Esto es más eficiente en términos de memoria, ya que no copia elementos, sino que simplemente apunta a la siguiente lista.
import itertools
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)
Cree un iterador que devuelva elementos del primer iterable hasta que se agote, luego continúe con el siguiente iterable, hasta que se agoten todos los iterables. Se utiliza para tratar secuencias consecutivas como una secuencia única.
Eso parece bastante razonable para lo que estás intentando hacer.
Una versión ligeramente más corta que se apoya en Python para hacer más trabajo pesado podría ser:
for logs in mydir:
for line in mylog:
#...if the conditions are met
list1.append(line)
if any(True for line in list1 if "string" in line):
list2.extend(list1)
del list1
....
Se (True for line in list1 if "string" in line)
itera list
y emite True
cada vez que se encuentra una coincidencia. any()
utiliza la evaluación de cortocircuito para regresar True
tan pronto como True
se encuentra el primer elemento. list2.extend()
añade el contenido de list1
al final.
Simplemente puede concatenar dos listas, por ejemplo:
list1 = [0, 1]
list2 = [2, 3]
list3 = list1 + list2
print(list3)
>> [0, 1, 2, 3]
puedes usar el método __add__ Magic:
a = [1,2,3]
b = [4,5,6]
c = a.__add__(b)
Output:
>>> c
[1,2,3,4,5,6]