Исключить элементы из списка из файла в python - PullRequest
0 голосов
/ 07 мая 2020

Это следующий список элементов:

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

и следующий текстовый файл (elements.txt) со списками элементов, которые должны храниться в списке:

elements.txt
aaa
ccc
ddd

идея состоит в том, чтобы удалить элементы из списка ЭЛЕМЕНТЫ, которых нет в файле elements.txt, поэтому окончательный результат после удаления будет следующим:

listELEMENTS = ['aaa', 'ccc']

код, который я сделал, был следующим, но он устраняет все элементы. Кто-нибудь знает где ошибка?

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)

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Проблема в вашем коде заключается в том, что вы проверяете каждый элемент listELEMENTS, если он существует в Speci c элементе файла вместо всех элементов файла (if i not in key).

Измените свой код на:

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']

Или вы можете сделать это немного короче, используя понимание списка:

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 голос
/ 07 мая 2020

Вы делаете две итерации в своем коде, по одной для каждой строки в файле, а внутри вы делаете по одной для каждого элемента в списке, поэтому, получив ваш пример, мы будем иметь:

Итерация 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
  • Итерация 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.

Я предлагаю вам изменить способ удаления данные из вашего списка, вместо того, чтобы редактировать список, который вы повторяете по нему, создайте новый с данными, которые вы фактически собираетесь использовать:

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 голос
/ 07 мая 2020

привет, вы можете использовать intersection:

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

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


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

, чтобы вы могли сделать что-то вроде этого:

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']

...