Tome el contenido de una lista y agréguelo a otra lista [duplicado]

Resuelto user1006198 asked hace 12 años • 9 respuestas

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.

user1006198 avatar Nov 18 '11 09:11 user1006198
Aceptado

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)
Sven Marnach avatar Nov 18 '2011 02:11 Sven Marnach

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 chainingo extendingy debe conocer las diferencias para usarlo sabiamente según sus necesidades.

Ampliar una lista

Usando el método listde 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]

ingrese la descripción de la imagen aquí

Encadenando una lista

Por el contrario, puede utilizar itertools.chainpara conectar muchas listas, lo que devolverá un llamado iteratorque 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)

ingrese la descripción de la imagen aquí

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.

user1767754 avatar Jan 18 '2018 07:01 user1767754

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 listy emite Truecada vez que se encuentra una coincidencia. any()utiliza la evaluación de cortocircuito para regresar Truetan pronto como Truese encuentra el primer elemento. list2.extend()añade el contenido de list1al final.

Kirk Strauser avatar Nov 18 '2011 02:11 Kirk Strauser

Simplemente puede concatenar dos listas, por ejemplo:

list1 = [0, 1]
list2 = [2, 3]
list3 = list1 + list2

print(list3)
>> [0, 1, 2, 3]
jack.py avatar Dec 27 '2020 04:12 jack.py

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]
Hossein Seyyedi avatar Apr 05 '2022 10:04 Hossein Seyyedi