length index comprehension python list

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 :)