index - Python: toma el contenido de una lista y añádelo a otra lista
python list to string (6)
Eche un vistazo a itertools.chain para una forma rápida de tratar muchas listas pequeñas como una sola lista grande (o al menos como una sola gran iterable) sin copiar las listas más pequeñas:
>>> import itertools
>>> p = [''a'', ''b'', ''c'']
>>> q = [''d'', ''e'', ''f'']
>>> r = [''g'', ''h'', ''i'']
>>> for x in itertools.chain(p, q, r):
print x.upper()
Estoy tratando de entender si tiene sentido tomar el contenido de una lista y anexarla 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 usa una segunda lista para guardar estas líneas y comenzar un nuevo ciclo sobre otro archivo.
Mi idea era obtener la lista una vez que se complete el ciclo, volcarlo en la segunda lista, luego comenzar un nuevo ciclo, volcar el contenido de la primera lista nuevamente en el segundo pero anexarlo, por lo que la segunda lista será el suma de todos los archivos de lista más pequeños creados en mi ciclo. La lista debe adjuntarse solo si se cumplen ciertas 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 sentido o debería tomar una ruta diferente?
Necesito algo eficiente que no ocupe demasiados ciclos, ya que la lista de registros es larga y cada archivo de texto es bastante grande; así que pensé que las listas encajarían en el propósito.
Eso parece bastante razonable para lo que estás tratando de hacer.
Una versión ligeramente más corta que se apoya en Python para hacer más trabajo pesado puede 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
....
El (True for line in list1 if "string" in line)
itera sobre la list
y emite True
cada vez que se encuentra una coincidencia. any()
usa la evaluación de cortocircuito para devolver True
tan pronto como se encuentre el primer elemento True
. list2.extend()
agrega los contenidos de list1
al final.
Para recapitular sobre las respuestas anteriores. Si tiene una lista con [0,1,2]
y otra con [3,4,5]
y desea unirlas, entonces se convierte en [0,1,2,3,4,5]
, [0,1,2,3,4,5]
, 3, 4, 5 [0,1,2,3,4,5]
, puede use chaining
o se extending
y debe conocer las diferencias para usarlas sabiamente para sus necesidades.
Extendiendo una lista
Usando el método de extend
clases de list
, puede hacer una copia de los elementos de una lista a otra. Sin embargo, esto causará el uso de memoria adicional, que debería estar bien en la mayoría de los casos, pero podría causar problemas si desea tener memoria eficiente.
a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]
Encadenando una lista
Contrariamente, puede usar itertools.chain
para conectar muchas listas, lo que generará un llamado iterator
que se puede usar para iterar sobre las listas. Esto es más eficiente desde el punto de vista de la memoria ya que no está copiando elementos sino simplemente apuntando a la siguiente lista.
from itertools import chain
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)
Cree un iterador que devuelva elementos desde el primer iterable hasta que se agote, luego continúe con el siguiente iterable, hasta que se agoten todos los iterables. Se usa para tratar secuencias consecutivas como una secuencia única.
Probablemente quieras
list2.extend(list1)
en lugar de
list2.append(list1)
Aquí está la diferencia:
>>> a = range(5)
>>> b = range(3)
>>> c = range(2)
>>> b.append(a)
>>> b
[0, 1, 2, [0, 1, 2, 3, 4]]
>>> c.extend(a)
>>> c
[0, 1, 0, 1, 2, 3, 4]
Como list.extend()
acepta un iterable arbitrario, también puede reemplazar
for line in mylog:
list1.append(line)
por
list1.extend(mylog)
Si tenemos una lista como a continuación:
list = [2,2,3,4]
dos formas de copiarlo en otra lista.
1.
x = [list] # x =[] x.append(list) same
print("length is {}".format(len(x)))
for i in x:
print(i)
length is 1 [2, 2, 3, 4]
2.
x = [l for l in list]
print("length is {}".format(len(x)))
for i in x:
print(i)
length is 4 2 2 3 4
Usar el map()
y reduce()
funciones incorporadas
def file_to_list(file):
#stuff to parse file to a list
return list
files = [...list of files...]
L = map(file_to_list, files)
flat_L = reduce(lambda x,y:x+y, L)
Mínimo "para bucle" y elegante patrón de codificación :)