Sé la siguiente lista de elementos:

listELEMENTS = ['aaa', 'bbb', 'ccc']

Y ser el siguiente archivo txt (elements.txt) con listas de elementos que deben mantenerse en la lista:

elements.txt
aaa
ccc
ddd

La idea es eliminar los elementos de la listaELEMENTS que no están en el archivo elements elements.txt, por lo que el resultado final después de la eliminación será este:

listELEMENTS = ['aaa', 'ccc']

El código que hice fue este, pero está eliminando todos los elementos. ¿Alguien sabe dónde está el error?

with open("elements.txt") as f:
    for line in f:
       (key) = line.split()
           for i in listELEMENTS :
               if i not in key:
                   listELEMENTS.remove(i)
0
simonica 7 may. 2020 a las 08:50

3 respuestas

La mejor respuesta

El problema en su código es que está verificando cada elemento de listELEMENTS si existe en un elemento específico del archivo en lugar de todos los elementos del archivo (if i not in key).

Cambia tu código a:

listELEMENTS = ['aaa', 'bbb', 'ccc']

with open("elements.txt") as f:
    file_elements = f.read().splitlines() # read all elements of the file into a list
    for i in listELEMENTS:
        if i not in file_elements:
        # check that i not exists in the full list of elements 
            listELEMENTS.remove(i)
print(listELEMENTS) # ['aaa', 'ccc']

O bien, puede hacerlo de una manera un poco más corta utilizando la comprensión de la lista:

with open("elements.txt") as f:
    file_elements = f.read().splitlines()
    listELEMENTS = [i for i in listELEMENTS if i in file_elements]
print(listELEMENTS) # ['aaa', 'ccc']
1
Gabip 7 may. 2020 a las 06:09

Hola puedes usar intersection:

a =  ['aaa', 'bbb', 'ccc'] 

b =  ['aaa', 'ccc', 'ddd']


list(set(a).intersection(b))
['ccc', 'aaa']

Para que puedas hacer algo así:

listELEMENTS = ['aaa', 'bbb', 'ccc'] 

with open("elements.txt") as f: 
    file_elements = f.read().splitlines() 
    #print(file_elements) 
    listELEMENTS =list(set(listELEMENTS).intersection(file_elements)) 
print(listELEMENTS)                                                   

['ccc', 'aaa']

1
Beny Gj 7 may. 2020 a las 06:05

Estás haciendo dos iteraciones en tu código, una para cada línea en el archivo y dentro de eso estás haciendo una para cada elemento de la lista, así que, obteniendo tu ejemplo, tendríamos:

  • Iteración 01:
    list_elements = ['aaa', 'bbb', 'ccc']
    line = 'aaa'
    key = ['aaa']

    Inside this iteration another one is going to happen, so:

    - Iteration 01:
        i = 'aaa'
        i is in key, no element removed.

    - Iteration 02:
        i = 'bbb'
        i is NOT in key, 'bbb' gets removed.
        Finished iteration because an element was removed from the list
  • Iteración 02
    list_elements = ['aaa', 'ccc']
    line = 'ccc'
    key = ['ccc']

    Inside this iteration another one is going to happen, so:

    - Iteration 01:
        i = 'aaa'
        i is NOT in key, 'aaa' gets removed INCORRECTLY.
        Iterator finished.

Le sugiero que cambie la forma en que está eliminando los datos de su lista, en lugar de editar una lista que está iterando sobre ella, cree una nueva con los datos que realmente usará:

listELEMENTS = ['aaa', 'bbb', 'ccc']
used_elements = []
with open("elements.txt") as f:
    file_content = f.read().splitlines()
    for i in listELEMENTS:
        if i in file_content:
            used_elements.append(i)

print(used_elements)
1
arthursribeiro 7 may. 2020 a las 06:11